2016-06-12 60 views
2

我正试图在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列都不包含在Institution表中,InstitutionId也不包含在Address表中。

感谢

+0

请参阅[共享主键关联](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-3-shared-primary-key-协会) –

回答

2

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

你除了你有什么权利,现在的选项有:

  1. 您可以解决这一点,从地址到机构建立单向一对多关联,然后在机构上AddressId FK创建一个唯一约束表。 SQL Server会将此关系视为1:1,而您的对象模型在Institution对象上看到地址,但是(当然)如果您还想查看Institution on Address对象(基本上如果需要),此选项对您不起作用双向1:1关联)。如果您对此选项感兴趣,那么我在here中解释此解决方法。

  2. 我一直在说EF 6,因为如果你可以升级,那么EF Core(以前的EF 7)支持一对一外键关联,因为它支持备用键。基本上这意味着它现在支持对于一对一外键关联至关重要的独特约束条件。

+0

谢谢@MortezaManavi,关于EF7的信息对我来说也是新的++ 1 –

+0

不客气。如果你决定在EF Core上给出1:1的关联,那么请注意,它目前有一个错误,我在这里解释:http://stackoverflow.com/questions/37536637/entity-framework-core-one-一对一关系,生成一到多,在-SQL服务器/ 37648998#37648998 –

相关问题