2013-10-02 85 views
0

我是新来的实体框架,我挣扎着从我的POCO类创建的数据库。我有一个泛型类,看起来像这样:EF一对多连接表

public class Comment 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public DateTime CreatedDate { get; set; } 
} 

和评论可以被添加到许多对象,让说,例如人和车辆,所以我有这些类

public class Person 
{ 
    public int Id { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

public class Vehicle 
{ 
    public int Id { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

当EF生成我的数据库它增加了一个PERSON_ID和Vehicle_Id,这对我来说是不正确,因为: 一)这表明,评论涉及个人和AV ehicle,它应该是一个真正的“独立式”对象 b)可以将注释添加到将要求更改表格的未来对象中。

我怎样才能让EF为此使用链接表? (注意:我不能也不想为Comment类添加导航属性,因为每次新对象需要注释时都需要更改类,而且我的注释类位于我的通用库中,与人员或车辆无关)

我发现这篇文章,但我挣扎着从它那里得到我的回答:http://weblogs.asp.net/manavi/archive/2011/05/17/associations-in-ef-4-1-code-first-part-6-many-valued-associations.aspx

回答

0

EF是产生在CommentPerson_IdVehicle_Id列,分别为空。这意味着评论可以链接到一个人或一辆汽车,或者一个人和一辆汽车或两者都不。所以它真的是“独立式”的对象。

您可能正在寻找的型号使用inheritance

public class Comment 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public DateTime CreatedDate { get; set; } 
} 

public class VehicleComment : Comment 
{ 
    public int VehicleID; 
} 

public class PersonComment : Comment 
{ 
    public int PersonID; 
} 


public class Person 
{ 
    public int Id { get; set; } 
    public List<PersonComment> Comments { get; set; } 
} 

public class Vehicle 
{ 
    public int Id { get; set; } 
    public List<VehicleComment> Comments { get; set; } 
} 

EF将默认为按层次继承。这将创建一个类似于您已有的表格,但带有“Discriminator”列。然后,您可以直接使用DbSet<VehicleComment>而不必查询DbSet<Comment> ... Where(x => x.Vehicle_Id != null)以获取有关车辆的评论。

是的,添加到未来对象中的注释将需要更改表格,但使用Code First时这并不是一件困难的事情。编写代码变得更简单,因为你不会通过某种链接实体。

编辑 当你添加一个新的实体,以评论的关系发生的另一个外键列被添加到评论表到关系模型的变化。在现有的表中添加一个可为空的列可能就像你可以获得的简单的模式更改。至于更改控制,无论如何你都要为新实体添加一个表 - 所以你有一个包含几行额外代码的迁移文件。

此外,有一个链接表将意味着放弃外键约束,级联删除等不是吗?

public class FooComment : Comment 
{ 
    //FooID means one more column in the table 
    public int FooID; 
} 

public class Foo 
{ 
    public int Id { get; set; } 
    public List<FooComment> Comments { get; set; } 
} 
+0

感谢您的建议,我对未来的变化表关注的是不涉及这么大的困难,但相关的更多变更控制,这实际上是一个比我要求的简化,在我的应用程序,这可能有大的执行挑战。另外从模式的角度来看,我认为它不得不为每个可能引用它的实体更新一个通用实体,但是我可能会以两种方式争论,但我不喜欢它。我会测试你的建议,但是如果它会创建一个PersonComment表和一个VehicleComment表,它可能不适用于我 –

+0

@AdriaanDavel Table Per Hierarchy为所有注释创建一个表 - 类似于你已经拥有的表,但是具有“Discriminator “专栏。使用TPH时,请参阅我的编辑实际更改的内容。 – Colin