11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】

原文连接:https://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspxhtml

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配置一对零或者一对一关系

这里咱们将使用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将会建立下面的数据库:
enter description here

使用Fluent 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为上面的一对一的例子建立实体对象模型,以下:
enter description here

这一节,一对一的关系就讲解完了,下一节学习一对多的关系。

相关文章
相关标签/搜索