如何在 sub class 和 Tag class 之间添加关系

how to add relation between sub class a Tag class

去父母那里我有五个 classes :

1.post :parent

  1. 和 3 个子 class :article,news.advertisement

3.tags

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

每个 class :article ,news,advertisement 有 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; }
    }

Entity Framework继承

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

结果是 EF 将尝试创建一个具有三个键列的 table,实际上是创建一个复合键。您还可以尝试将三个 Tags 属性合二为一 table。那不行。

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

Entity Framework配置

当您在 class 上创建名为 Idint 属性 时,EF 会自动将其设为自增主键。通过继承,您只需要一个主键列,因为每种具体类型都有一条记录,无论是 NewsArticle 还是 Advertisement.

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

解决方案示例

你可以先使用下面的EF代码classes:

  public abstract class Post {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public virtual ICollection<Tag> Tags { get; set; } 
    // etc...
  }

  public class Article : Post {}

  public class News : Post {}

  public class Advertisement : Post {
    public DateTime ExpirationDate { get; set; }
  }

  public class Tag {
    public int Id { get; set; }
    public string Value { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
  }

  public class PostsContext : DbContext {
    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }
  }