EF 6 Code-First系列文章目录:typescript
这里,你将学习在两个实体间,配置一对零或者一对多的关系。
咱们使用Student和StudentAddress实体来配置这种关系:数据库
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
public int StudentAddressId { 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; }
}
你能够看这篇文章,Entity Relationship 来理解EF怎么管理一对1、一对多、多对多关系的。api
一对零或一对一的关系发生在这样的两个实体之间:当一个表的主键,是另一个表的主键而且是外键的时候,因此咱们须要配置Student实体中的StudentID属性为主键,而后StudentAddressID既是主键又是外键。app
这里,咱们将使用数据注解特性来给Student实体和StudentAddress实体,配置一对零或者一对一关系。ide
Student实体遵循默认的约定,它包含一个StudentId属性,因此到时候这个属性就会成为Students表的主键,Student实体咱们不用做任何修改,就让它根据默认配置就行。学习
对于StudentAddress实体,咱们须要配置StudentAddressId为主键和外键,由于StudentAddressId遵循约定,因此只用给它配置外键。测试
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
[ForeignKey("Student")]
public int StudentAddressId { 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; }
}
这样就使用数据注解配置了一对零或一对一的关系了。ui
请注意:Student包含StudentAddress导航属性,而且StudentAddress实体包含Student导航属性。在一对零或一对一关系中,Student能够在没有StudentAddress的状况下被保存,可是StudentAddress没有Student的状况下不能保存。EF将会抛出异常,若是你没有Student实体就保存StudentAddress实体的话。spa
这里咱们将使用Fluent API配置一对零或者一对一关系。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
.HasOptional(s => s.Address) // Mark Address property optional in Student entity
.WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student
}
上面的例子中,咱们从Student实体开始配置,HasOptional()方法配置Student实体中的Address导航属性为可选的【保存Student实体的时候,能够没有StudentAddress实体】,而后WithRequired方法设置StudentAddress实体中的Student导航属性为必须的【保存StudentAddress实体的时候,必需要有Student】。上面的代码,一样会使StudentAddressId成为外键。
这样你就配置了一对零或者一对一的关系,这里Student能够在没有StudentAddress的状况下保存,可是StudentAddress不能在没有Student的状况下保存。EF API将会建立下面的数据库:
咱们可使用Fluent API配置一对一的关系,这样状况下,两个实体对于彼此都是必须的,意味着:Student必须包含StudentAddress,而且StudentAddress必须包含Student。
请注意:SQL Server中,一对一的关系,在技术上是不可能的。上面的代码设置将会永远是一对零或一对一关系。EF只是对实体造成一对一的关系,并非在数据库中是一对一关系。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure StudentId as FK for StudentAddress
modelBuilder.Entity<Student>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(ad => ad.Student);
}
上面的代码中,modelBuilder.Entity<Student>().HasRequired(s => s.Address)
,是设置Student实体中的 StudentAddress导航类型的Address属性是必须的,.WithRequiredPrincipal(ad => ad.Student)
是设置StudentAddress实体中的Student属性是必须的。
使用 EF Power Tools为上面的一对一的例子建立实体对象模型,以下:
这一节,一对一的关系就讲解完了,下一节学习一对多的关系。