【问题标题】:how to add relation between sub class a Tag class如何在子类和标签类之间添加关系
【发布时间】:2015-02-03 19:15:29
【问题描述】:

去Parent我有五门课:

1.post :parent

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

3.标签

如何在 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; }
    }

【问题讨论】:

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


    【解决方案1】:

    实体框架继承

    您在代码优先模型中使用继承。默认情况下,EF 将使用one table per hierarchy 策略进行继承。它将所有列以及一个“鉴别器”列放在一个表中,该列包含类型的名称(在您的情况下为“文章”、“新闻”或“广告”)。

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

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

    实体框架配置

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

    关于Tags,您正在创建多对多关系。所以,每个Post 应该有ICollection&lt;Tag&gt; Tags,每个Tag 应该有ICollection&lt;Post&gt; Posts。将集合设为virtual 以启用延迟加载。

    解决方案示例

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

      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; }
      }
    

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多