让我们假设我有一个类模型:
public class BlogPost
{
...
[Key]
public Guid Id {get;private set;}
public virtual ICollection Comments {get;private set;}
}
public class Comment
{
[Key]
public Guid Id {get;private set;}
public string Text{get;set;}
}
这里不要过多地阅读我的伪代码,但如果我想知道: 评论类是否必须具有Guid BlogPostId或BlogPost父属性?
我可以像上面那样对注释类进行建模,并且仍然通过BlogPost.Comments属性将其映射到blogpost。 例如通过提供一些其他映射属性
我不希望聚合成员了解他们的AR。
答案 0 :(得分:2)
是的,当帖子有评论的导航属性时,你不会被迫在评论实体中指定帖子ID(即FK)或引用:
public class BlogPost
{
public Guid Id { get; private set; }
public virtual ICollection<Comment> Comments { get; private set; }
}
public class Comment
{
public Guid Id { get; private set; }
public string Text { get; set; }
}
在这种情况下,EF将在Comments表中生成名称为BlogPost_Id
的FK列(默认情况下,它使用父实体名称和父实体键属性名称)。此外,如果列的名称类似于[Key]
或id
,则无需使用TypeNameId
属性标记键列。
生成的表格如下:
如果要更改生成FK名称而不在注释实体上声明属性,可以使用流畅映射(通常我建议您使用流畅映射而不是数据注释属性 - 这将使您的实体更清晰)。要提供映射,请覆盖数据上下文的OnModelCreating
方法:
modelBuilder.Entity<BlogPost>()
.HasMany(bp => bp.Comments)
.WithRequired()
.Map(c => c.MapKey("PostId"))
.WillCascadeOnDelete();