2013-10-15 135 views
2

我對EF的循環依賴有點困惑,因爲它似乎就像所有東西都會變成循環依賴。實體框架代碼第一個循環的依賴關係

this tutorial

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

尋找當我在Vs2012運行「碼圖」我真的不看,這是一個循環引用

enter image description here

我應該不用擔心這個?我試圖使用Autofixture生成虛擬數據,但由於循環引用而崩潰。

回答

2

我想這取決於你問誰,如果你應該擔心或不關心雙向關聯。在領域驅動的設計中,人們通常會說你應該擔心這一點。 例如埃裏克埃文斯在他的書Domain driven design: tackling the complexity in the heart of software說,你應該儘可能避免它們。

朱莉·勒曼在最近的文章中here

在你提供的實體框架不應該有,如果你刪除的帖子的博客和BlogId性質的任何抱怨,但有可能是其他更復雜的簡單的例子,寫入有關問題案例。

實體將默認將數據庫中的Posts行中的外鍵添加到擁有的「博客」行,但域模型只能從「博客」導航到「帖子」。

以下片段將首先從數據庫加載第一個Blog,然後延遲加載該博客的帖子。

using (var db = new BlogContext()) 
{ 
    var blog = db.Blogs.FirstOrDefault(); 

    //lazy loading the Posts of the blog that was fetched in previous line   
    foreach (var post in blog.Posts) 
    { 
     Trace.TraceInformation(string.Format("Title of post {0} is {1}", post.Id, post.Title)); 
     } 
    } 
} 

如果你真的需要兩個來自博客瀏覽到的帖子和文章,以博客,因爲在你的應用程序的一些業務需求,那麼你將有查詢和雙向之間的關聯關係來決定。 選擇哪一個完全取決於你,Entity Framework支持兩者。

雙向關聯是當您在兩側都具有導航屬性時,使您能夠在兩個方向上導航。即如果Blog有Posts屬性,並且每個Post都有一個指向Blog的Blog屬性,那麼我們有一個雙向關聯。

另一種選擇是僅在一側具有導航屬性。例如。一個博客可能包含一個帖子列表,這可以很容易地從博客導航到帖子,這可能是最需要的。 如果您在某些用例中對某個帖子有引用並需要找出它屬於哪個Blog,那麼您可以通過在您的存儲庫/ dbcontext上執行查詢來查找該博客,以搜索其中包含該帖子的Blog對象帖子列表。

DDD的倡導者經常會推薦單向導航和查詢是否需要反向導航。

+0

但是後來我失去了兩個文件之間的鏈接,並且基本上殺死了懶加載(甚至是急切的加載),因爲我無法再做Post.Blog.Id了,現在我必須編寫一個單獨的查詢來做同樣的事情。那不是限制EF嗎?我對EF非常陌生,在Nhibernate中我知道你必須擁有Blog in Post,否則連接永遠不會發生。看起來像ORMs強制這種方式,即使我得到它沒有數據庫方面的循環引用它將存在於域中。 – chobo2

+0

沒有延遲加載工作就沒有雙向導航沒問題。在上面的帖子中增加了示例代碼。 –

+0

雅我正在從帖子到博客而不是博客到帖子。我只是非常習慣於訪問域中的另一端,就像我說的那樣,對於Nhibernate來說這是非常必要的。從你所說的EF不是強制性的,但我還沒有嘗試過。 「......查詢和雙向關聯」是什麼意思? – chobo2