实体框架代码优先,同一实体的一对一和一对多关系

时间:2016-08-31 10:59:43

标签: c# entity-framework ef-code-first entity-framework-6 code-first

我正在使用实体框架的v6.0创建代码优先数据库。我有一个组织类和c#中定义的相关位置类,如下所示:

public class Organisation
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Location> Locations { get; set; }

    public int? HQLocationId { get; set; }
    public Location HQLocation { get; set; }
}

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int OrganisationId { get; set; }
    public Organisation Organisation { get; set; }
}

从类中可以推断,组织可以有多个位置,但是它只能有一个总部位置。< / p>

我正在使用Fluent API来配置这些类之间的关系。 “多个位置”方面很简单,可以使用以下内容:

   HasMany(o => o.Locations)
      .WithRequired(o => o.Organisation)   
      .HasForeignKey(l => l.OrganisationId);

但我似乎无法找到正确的语法来定义允许定义HQ位置的关系。如果我正在采取的方法存在缺陷,或者我只是错过了正确的语法?

更新

如果我将以下内容添加到组织配置:

   HasOptional(o => o.HQLocation)
      .WithMany()
      .HasForeignKey(o => o.HQLocationId)
      .WillCascadeOnDelete(true);

然后,Entity Framework不再出现错误,我的数据加载的形状也符合我的需要。

但是,对于多个组织,这允许位置 HQ ;理想情况下我不希望这样。

1 个答案:

答案 0 :(得分:1)

一对一一对一或一个关系Id在两个实体上都应相同。这意味着Organisation.Id必须与Location.Id的{​​{1}}相同。当然,这不是好的设计选择。我建议将属性添加到HQLocation以表明它是否为Location

HQLocation