EF6:使用集合属性而不在子表中创建FK字段

时间:2017-11-12 11:03:37

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

我正在学习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保存和加载,没有任何问题。感谢&#34; parent&#34;中的导航属性。 LivingRoom类,Persons集合将包含在此过程中。我不必单独加载/保存它们。

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

到目前为止一切顺利。

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

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

我是否可以在不破坏&#34;包含子列表的情况下实现此目的(不创建FK字段)&#34;加载/保存过程如上所述?

如果是,怎么样?如果不是,为什么不呢?

注意:请理解我想学习最好的技巧。如此好的建议,不这样做,也是受欢迎的。

1 个答案:

答案 0 :(得分:0)

首先,最好在FK表格中处理Person表格自己做这个网站有这个:

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

}

您可以将人员表中的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以及类似的东西,......

相关问题