【问题标题】:EF6: Using collection property without creating FK field in child tableEF6:使用集合属性而不在子表中创建 FK 字段
【发布时间】:2017-11-12 19:22:13
【问题描述】:

我正在学习 EF6,我想我已经知道了很多,但是(还)找不到一个好的解决方案:

假设我有以下模型类:

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

    public PersonTypeId { get; set; }
    public IList<Person> Persons { get; set; } 
}

class Person {
    public int Id { get; set; }
    public int PersonTypeId { get; set; }
    public string Name { get; set; }
}

使用这些模型类,我可以毫无问题地通过 DbContext 进行保存和加载。由于“父” LivingRoom 类中的导航属性,Persons 集合将包含在此过程中。我不必单独加载/保存它们。

更新:忘记了逻辑 PersonTypeId 字段,该字段将用于确定哪些 Persons 应该在集合属性中。

到目前为止一切顺利。

但是 EF6 正在 Persons 表中创建一个 FK,指向 LivingRooms 表,这似乎是合乎逻辑的。

但是,如果我要将 Persons 表用于更多其他父实体,例如,例如。 “Bus”和“Plane”,因此不想在 Persons 表中有依赖项(= LivingRooms 表中的 FK 字段)?

我可以在不破坏“包含子列表”加载/保存过程的情况下实现这一点(不要创建 FK 字段)吗?

如果是,如何?如果没有,为什么不呢?

注意:请理解我想学习最好的技术。所以好的建议,不要这样做,也是受欢迎的。

【问题讨论】:

  • 如果PersonLivingRoomBusPlane 等的一部分,如果不将该信息存储在Person 表的FK 列中,您将如何确定?这不是 EF 特有的,而是关系数据库设计问题。
  • 不想有依赖项 这是一种常见的(反)模式,称为 多态关联,我有 my own struggles with .关系数据库不提供平滑建模此类关联的概念基础,因此除非您愿意转向 NoSQL 数据库,否则您将不得不采用一种或多或少不舒服的解决方案。

标签: c# entity-framework entity-framework-6


【解决方案1】:

首先,最好在Person 中处理FK 表我们自己做那个web 有这个:

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

    public IList<Person> Persons { get; set; }
}

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public LivingRoom LivingRoom { get; set; }
    public int LivingRoomId { get; set; }
}

现在如果您有其他实体,例如 Bus 和 ... 所以我们有

public class Bus
{
    public int Id { get; set; }
    public ICollection<Person> People { get; set; }
}

更新的 Person 类是:

 public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public LivingRoom LivingRoom { get; set; }
    public int LivingRoomId { get; set; }

    public Bus Bus{ get; set; }
    public int BusId { get; set; }

}

您可以在 Person Table 中将 FK 设置为 Nullable 来执行此操作:

 public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public LivingRoom LivingRoom { get; set; }
    public int? LivingRoomId { get; set; }

    public Bus Bus{ get; set; }
    public int? BusId { get; set; }

}

如您所见,我们将BusIdLivingRoomId 设置为nullable,或者您可以只设置您想要的其中一个

注意:您需要添加一些映射器来告诉 EF 哪个字段 id FK 和类似的东西,...

【讨论】:

  • 谢谢,但我的问题是是否有可能拥有 FK 字段。
  • 这与在其他实体中仅包含集合相同 - EF 会按照您的建议自动创建可选的 FK 列(按照约定命名会有所不同)。
  • @JohanV 不,你的表中必须有`FK`(我的意思是在 SQL Server 的结果中)
  • @IvanStoev 是的 EF 自动创建 FK 列,但我们的模型中最好有 FK 属性
猜你喜欢
  • 2022-01-14
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多