如何在 sub class 和 Tag class 之间添加关系
how to add relation between sub class a Tag class
去父母那里我有五个 classes :
1.post :parent
- 和 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 中。在这种情况下,删除 ArticleId
、NewsId
和 AdId
。在 Post
class 中创建一个 Id
属性。现在也将 Tags
属性 移动到基数 class 。请参阅下一节,了解如何在 EF 中配置它。
Entity Framework配置
当您在 class 上创建名为 Id
的 int
属性 时,EF 会自动将其设为自增主键。通过继承,您只需要一个主键列,因为每种具体类型都有一条记录,无论是 News
、Article
还是 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; }
}
去父母那里我有五个 classes :
1.post :parent
- 和 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 中。在这种情况下,删除 ArticleId
、NewsId
和 AdId
。在 Post
class 中创建一个 Id
属性。现在也将 Tags
属性 移动到基数 class 。请参阅下一节,了解如何在 EF 中配置它。
Entity Framework配置
当您在 class 上创建名为 Id
的 int
属性 时,EF 会自动将其设为自增主键。通过继承,您只需要一个主键列,因为每种具体类型都有一条记录,无论是 News
、Article
还是 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; }
}