Configure One-to-One(配置一对一关系)【Code-First系列】

现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键【实际上是一对零或者一对一】。

请注意:一对一的关系,在MS SQL Server中,技术上是不可能实现的,主要还是一对零或者一对一的关系。

想了解更多的实体关系,请看MSDN,这里面讲解的很详细。----->>>Entity Relationship。

一、使用数据注解特性,来配置一对一(一对零)的关系。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class Student
    {
       public int StudentID { get; set; }

       public string StudentName { get; set; }

       public virtual StudentAddress StudentAddress { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;

namespace EF5
{
   public class StudentAddress
    {
       //ForeignKey属性里面的参数填写的是导航属性。
       [Key, ForeignKey("Student")] public int StudentID { get; set; } 
       public string Address1 { get; set; }

       public string Address2 { get; set; }
       public string City { get; set; }
       public int Zipcode { get; set; }
       public string State { get; set; }
       public string Country { get; set; }

       public virtual Student Student { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString") 
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

       
    }
}

 

得到的数据库:

Configure One-to-One(配置一对一关系)【Code-First系列】_第1张图片

请注意,在上面的代码中,Student实体中,我没有做任何事情,然后Code-First默认约定,就将StudentID作为表的主键,然后在StudentAddress实体中,我特别指定了Key和ForeignKey特性,为了标注StudentId既是主键又是外键。在ForeignKey特性中,我指定了Student实体参数,所以就构成了一对一的关系。

当然我们可以使用Fluent API来配置一对一的关系:

使用Fluent APi来配置一对一(一对零)的关系

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString") 
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置表的主键
           modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID);            //配置表的外键
           modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress);            
           base.OnModelCreating(modelBuilder);
       }

       
    }
}

Configure One-to-One(配置一对一关系)【Code-First系列】_第2张图片

请注意:下面的代码,写法有错误,弄反了!!!

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF5
{
   public class DbContextClass:DbContext
    {
       public DbContextClass() : base("ConnectionString") 
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }
       public DbSet<StudentAddress> StudentAddresses { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置表的主键
           modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID);

           //配置表的外键
          // modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress);
           modelBuilder.Entity<StudentAddress>().HasOptional(s => s.Student).WithRequired(p => p.StudentAddress); 
           base.OnModelCreating(modelBuilder);
       }

       
    }
}

这样得到的数据库是:

Configure One-to-One(配置一对一关系)【Code-First系列】_第3张图片

 

后面的一节中将学到,怎么配置一对多的关系。

 

 

附上系列目录:

  • 什么是Code First
  • 简单的Code First例子
  • Code-First 约定
  • DB Initialization(数据库初始化)
  • Inheritance Strategy(继承策略)
  • Configure Domain Classes(配置领域类)
  • DataAnnotations(数据注解)
  • Fluent API
  • Configure One-to-One(配置一对一关系)
  • Configure One-to-Many(配置一对多关系)
  • Configure Many-to-Many(配置多对多关系)
  • Move Configurations(数据迁移)
  • DB Initialization Strategy(数据库初始化策略)

 

你可能感兴趣的:(Configure One-to-One(配置一对一关系)【Code-First系列】)