Entity Framework Code First是否支持这种映射?

时间:2013-11-28 13:28:57

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

让我们假设我有一个类模型:

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。

1 个答案:

答案 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属性标记键列。

生成的表格如下:

enter image description here

如果要更改生成FK名称而不在注释实体上声明属性,可以使用流畅映射(通常我建议您使用流畅映射而不是数据注释属性 - 这将使您的实体更清晰)。要提供映射,请覆盖数据上下文的OnModelCreating方法:

modelBuilder.Entity<BlogPost>()
    .HasMany(bp => bp.Comments)
    .WithRequired()
    .Map(c => c.MapKey("PostId"))
    .WillCascadeOnDelete();