【问题标题】:Entity Framework code-first, one-to-zero-to-one and one-to-many relationship to same entity实体框架代码优先、一对零对一和一对多关系到同一实体
【发布时间】:2016-08-31 10:59:42
【问题描述】:

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

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; }
}

从类中可以推断,一个组织可以有多个位置,但它只能有一个总部位置

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

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

但是,我似乎找不到正确的语法来定义允许定义总部位置的关系。如果我采用的方法存在缺陷,或者我只是缺少正确的语法?

更新

如果我将以下内容添加到 Organisation 配置中:

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

然后 Entity Framework 不再出错,我的数据以适合我需要的形状加载。

但是,这允许一个位置成为多个组织总部;理想情况下,我不希望这样。

【问题讨论】:

  • 你最后解决了吗?
  • 不,我添加到原始帖子中的“更新”是我在时间用完时留下的妥协。

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


【解决方案1】:

一对一一对零或一关系中Id在两个实体上应该是相同的。这意味着对于HQLocationOrganisation.Id 必须与Location.Id 相同。当然,这不是好的设计选择。我建议将属性添加到Location 以指示它是否为HQLocation

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

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

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

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

【讨论】:

  • 如果没有其他选项,我会考虑这个解决方案。但是,它允许将任意数量的位置标记为总部。我的设计要求是每个组织只有一个总部。因此,这提出了一种不同的设计,而不是回答这个问题。那就是说....不是我投了反对票。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2013-02-13
  • 2015-04-14
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多