在我的项目中有2个类(这将增加)Post
和Product
,两者都可以在下面发表评论是我创建的结构但是没有工作
我为可以有评论的实体创建了一个界面
public interface ICommentable
{
int Id { get; set; }
}
Post
和Product
个实体可能有评论
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; }
}
答案 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; }
}
类似的东西可以工作的唯一情况是映射继承,但它会强制你的Post
和Product
从映射的基本实体继承,这种继承将反映在数据库中。在这种情况下,您可以为基本实体提供单独的表,并且此表可以与Comment
(而不是派生表)相关。
在处理关系时,一定要考虑如何在数据库中完成它。 EF映射的类必须遵循类似的规则。