2013-11-28 158 views
2

讓我們假設我有一類模型,如下所示:實體框架代碼首先支持這種映射嗎?

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。

回答

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會生成評論表FK列其中將具有名稱BlogPost_Id(默認情況下它將父實體名稱與父實體關鍵屬性名稱一起使用)。如果列的名稱爲idTypeNameId,則也不需要使用[Key]屬性標記關鍵列。

生成的表格看起來像:

enter image description here

如果要更改恕不評論實體申報財產產生FK名稱,你可以用流利的映射(一般我建議你用流利的映射,而不是數據註釋屬性 - 這將使你的實體更清潔)。爲了提供映射覆蓋您的數據上下文的OnModelCreating方法:

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

Oohh,好看,沒想到卻是足夠聰明僅約定做到這一點。謝謝:) –

+0

是否可以將外鍵的列命名爲不添加屬性?例如如果我希望外鍵映射到現有的列出於傳統原因? –

+0

@RogerAlsing肯定,更新答案與映射示例 –