转到ParentI有五个类:
1.post:parent
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; }
}
答案 0 :(得分:1)
您在代码优先模型中使用继承。默认情况下,EF将使用one table per hierarchy策略进行继承。它会将所有列放在一个表中,同时放置一个“Discriminator”列,其中包含该类型的名称(在您的案例中为“Article”,“News”或“Advertisement”)。
这样做的结果是EF将尝试创建一个包含三个键列的表,实际上是创建一个复合键。您还尝试在一个表中包含三个Tags
属性。那不行。
与所有继承一样,将基本属性和行为放在基类中。在这种情况下,请移除ArticleId
,NewsId
和AdId
。在Id
类中创建一个Post
属性。暂时将Tags
属性移动到基类。请参阅下一节,了解如何在EF中配置它。
在类上创建名为int
的{{1}}属性时,EF会自动使其成为自动递增的主键。使用继承,您只需要一个主键列,因为每个具体类型都有一条记录,无论是Id
,News
还是Article
。
关于Advertisement
,您正在创建多对多关系。因此,每个Tags
应该有Post
,每个ICollection<Tag> Tags
应该有Tag
。使集合ICollection<Post> Posts
启用延迟加载。
您可以使用以下EF代码的第一个类:
virtual