多个实体(Post& Product)将共同实体(Comment)作为ICollection

时间:2012-03-17 18:24:12

标签: entity-framework entity-framework-4 entity-framework-4.1

在我的项目中有2个类(这将增加)PostProduct,两者都可以在下面发表评论是我创建的结构但是没有工作

我为可以有评论的实体创建了一个界面

public interface ICommentable
{
    int Id { get; set; }
}

PostProduct个实体可能有评论

public class Post : ICommentable
{
    public int Id { get; set; }
    public string Text { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Product : ICommentable
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Rate { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

评论实体本身

public class Comment
{
    public int Id { get; set; }
    public string Message { get; set; }

    public int ItemId { get; set; }
    public ICommentable Item{ get; set; }
}

Data Contxet

public class DataBaseContext:DbContext
{
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<Product> Products { get; set; }
}

1 个答案:

答案 0 :(得分:1)

实体框架不支持接口,因此这是您的第一个问题。第二个问题是导航属性通常不能“多态”=您需要为要与ICommentable相关的每个Comment单独导航属性(和FK):

public class Comment
{
    public int Id { get; set; }
    public string Message { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }

    public int ProductId { get; set; }
    public Product Product { get; set; }
}

类似的东西可以工作的唯一情况是映射继承,但它会强制你的PostProduct从映射的基本实体继承,这种继承将反映在数据库中。在这种情况下,您可以为基本实体提供单独的表,并且此表可以与Comment(而不是派生表)相关。

在处理关系时,一定要考虑如何在数据库中完成它。 EF映射的类必须遵循类似的规则。