0

我是 Entity Framework 的新手,我正在努力处理从我的 POCO 类创建的数据库。我有一个看起来像这样的通用类:

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

并且可以将注释添加到许多对象中,例如 Person 和 Vehicle,所以我将拥有这些类

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,这对我来说是不正确的,因为:a)它表明评论与人和车辆有关,它实际上应该是一个“独立”对象 b)评论可以是添加到需要更改表的未来对象。

我怎样才能让 EF 宁愿为此使用链接表?

(注意:我不能也不想向 Comment 类添加导航属性,因为每次新对象需要评论时都需要更改类,并且我的评论类在我的通用库中,与人或车辆无关)

我找到了这篇文章,但我很难从中得到答案:http ://weblogs.asp.net/manavi/archive/2011/05/17/associations-in-ef-4-1-code-第一部分 6-many-valued-associations.aspx

4

1 回答 1

0

EF 正在生成表上的列Person_Id,这些列可以为空。这意味着评论可以链接到一个人或一辆车或一个人和一辆车或两者都没有。所以它真的是一个“独立”的对象。Vehicle_IdComment

您可能正在寻找的模型使用继承

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 将默认为每个层次结构的表继承。这将创建一个类似于您已经拥有的表,但具有“鉴别器”列。然后,您可以DbSet<VehicleComment>直接使用 a 而不必查询DbSet<Comment>...Where(x => x.Vehicle_Id != null)来获取有关 Vehicles 的评论。

是的,添加到未来对象的注释将需要更改表,但这在使用 Code First 时并不完全是困难。并且编写代码变得更加简单,因为您不需要通过某种链接实体。

编辑 当您添加一个与 Comments 有关系的新实体时发生的变化是另一个外键列被添加到 Comments 表中以对该关系建模。向现有表添加可为空的列可能是您可以获得的最简单的架构更改。至于变更控制,无论如何您都在为新实体添加一个表 - 所以您有一个包含几行额外代码的迁移文件。

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

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; }
}
于 2013-10-02T08:34:57.047 回答