如何在子类和Tag类之间添加关系

时间:2015-02-03 19:15:29

标签: c# entity-framework oop ef-code-first code-first

转到ParentI有五个类:

enter image description here

1.post:parent

  1. 和3子类:article,news.advertisement
  2. 3.tags

    如何创建3个子类和标签之间的关系。

    每个类:文章,新闻,广告有0个或许多标签。 请帮帮我。

    public abstract  class Post
        {
    
    
            protected string Title { get; set; }
    
            protected string Content { get; set; }
            protected DateTime AddDate { get; set; }
            protected bool IsReady { get; set; }
            public virtual Member Member { get; set; }
            [ForeignKey("Member")]
            public int MemberID { get; set; }
            [DefaultValue(0)]
            public int Views { get; set; }
            public ICollection<Tag> Tags { get; set; }
            public ICollection<Comment> Comments { get; set; }
    }
    
    public class Article:Post
        {
           [Key]
            public int ArticleId { get; set; }
           public IList<Tag> Tags { get; set; }
        }
     public sealed class Tag
        {
           [Key]
            public int TagId { get; set; }
            public string Value { get; set; }
    
    
    
        }
    
    public class News : Post
        {
           [Key]
            public int NewsId { get; set; }
           public IList<Tag> Tags { get; set; }
        }
    

1 个答案:

答案 0 :(得分:1)

实体框架继承

您在代码优先模型中使用继承。默认情况下,EF将使用one table per hierarchy策略进行继承。它会将所有列放在一个表中,同时放置一个“Discriminator”列,其中包含该类型的名称(在您的案例中为“Article”,“News”或“Advertisement”)。

这样做的结果是EF将尝试创建一个包含三个键列的表,实际上是创建一个复合键。您还尝试在一个表中包含三个Tags属性。那不行。

与所有继承一样,将基本属性和行为放在基类中。在这种情况下,请移除ArticleIdNewsIdAdId。在Id类中创建一个Post属性。暂时将Tags属性移动到基类。请参阅下一节,了解如何在EF中配置它。

实体框架配置

在类上创建名为int的{​​{1}}属性时,EF会自动使其成为自动递增的主键。使用继承,您只需要一个主键列,因为每个具体类型都有一条记录,无论是IdNews还是Article

关于Advertisement,您正在创建多对多关系。因此,每个Tags应该有Post,每个ICollection<Tag> Tags应该有Tag。使集合ICollection<Post> Posts启用延迟加载。

解决方案样本

您可以使用以下EF代码的第一个类:

virtual