如何在Entity Framework代码优先创建一个到零或一个关系?

时间:2016-06-12 15:44:00

标签: c# entity-framework

我正在尝试在InstitutionAddress表之间创建一对一或零关系。我基本上期望在建立关系后AddressId列将包含在Institution表中。

这是我的代码:

public class Institution
{
    public int InstitutionId { get; set; }
    public string Name { get; set; }

    //1 to 1 with Address
    public virtual Address Address { get; set; }

    //one--to-many with Professor
    public virtual IList<Professor> Profesors { get; set; }
}

public class Address
{
    public int AddressId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public int StateId { get; set; }
    public int CountryId { get; set; }
    public string ZipCode { get; set; }

    public virtual Institution Institution { get; set; }
}

在上下文类中:

modelBuilder.Entity<Institution>()
            .HasOptional(i => i.Address)
            .WithRequired(ad => ad.Institution);

当我看到数据库图时,我看到这两个表之间建立了一种关系 - 在该行的两端都有一个黄色的键 - 但AddressId表中都没有包含InstitutionInstitutionId表格中也不包含Address

由于

1 个答案:

答案 0 :(得分:2)

基本上你的目的是创建一个 One-to-One Foreign Key Association ,而EF给你一个 Shared Primary Key Association ,因为EF 6不会 支持前者和共享主键关联是EF 6在1:1实体关系方面支持的唯一关联类型。

您现在的选择除了:

  1. 您可以解决此问题,并创建从地址到机构的单向一对多关联,然后在机构表上的AddressId FK上创建唯一约束。当您的对象模型看到Institution对象上的Address时,SQL Server将看到此关系为1:1,但是(当然)如果您还希望看到Institution on Address对象,则此选项对您不起作用(基本上如果您需要)双向1:1关联)。如果您对此选项感兴趣,请在here中解释此解决方法。

  2. 我一直在上面的行中说EF 6,因为如果你可以升级,那么EF Core(以前的EF 7)支持一对一的外键关联,因为它支持备用键。基本上它意味着它现在支持对于一对一外键关联必不可少的唯一约束。