3

我正在試驗DDD和EF 4.1 Code First。 我有一個聚合根BlogEntry看起來simlar這樣:DDD,EF,Aggregations

public class BlogEntry 
{ 
    public long Id { get; set; } 
    public string Title { get; set;} 
    public string Content { get; set; } 
    public DateTime Created { get; set; } 

    public virtual ICollection<BlogEntryComment> Comments { get; set; } 
} 

現在,我想顯示最新10篇博客文章的標題和評論在一個門戶網站,這些博客文章的數量。

目前這是實現與此類似:

foreach(BlogEntry be in blogEntryRepository.GetLatestBlogEntries()) 
{ 
    string title = be.Title; 
    int amountOfComments = be.Comments.Count(); 
    // display title, amountOfComments, ... 
} 

可惜的是什麼實體框架在這裏所做的是執行一個查詢來獲取BlogEntry對象之後,它執行一個查詢每個BlogEntry檢索的數註釋。

- > EF生成的SQL與此類似:

select top 10 * from BlogEntry order by Created desc 

,然後10倍:

select count(*) from BlogEntryComment where BlogEntry = @blogEntryId 

如何防止在某種程度上這種行爲沒有預先加載的所有意見,但仍然沒有根據數據庫爲每個BlogEntry拍攝查詢 - 但不會與任何DDD規則相沖突?

(我想什麼EF火災對數據庫是這樣的:)

select top 10 
be.*, 
(select count(*) from BlogEntryComment c where c.BlogEntryId = be.Id) as AmountOfComments 
from BlogEntry be order by be.Created DESC 

感謝。

回答

2

我會選擇簡單,肯定更有效的方式 - 只需添加NumberOfComments財產上BlogEntry,每評論增加它,堅持它。只是基於聚合負責保持數據一致的事實。考慮到只顯示數據的請求數量與實際更新數量之間的關係,我認爲每次有人想要查看時都沒有理由對此數字進行計數。

0

你能做到這樣,但它會創建匿名類型,

var p= from a in db.BlogEntries 
     select new {a, a.Comments.Count}; 
     var k = p.ToList(); 

編輯 .. 你可以像這樣,

禁用延遲加載, 評論數屬性添加到blogEntry域類

public class BlogEntry 
     { 
      public int commentCount{ 
      get 
      { 
      if(this.comments==null){ 
       return this._commentCount 
      }else{ 
       return this.Comments.count; 

      } 
      } 
      set{ 
       this._commentCount=value; 
      } 


     } 
     //other properties... 

     } 

將新方法添加到您的存儲庫以獲取所有評論數,

var p= from a in db.BlogEntries 
     select new BlogEntry{Id=a.Id,CommentCount= a.Comments.Count , ect..}; 
     var k = p.ToList(); 
+0

我意識到這一點,但如何適應ddd環境。 不是應該返回實體的存儲庫 - 不是匿名類型? – bes

+1

@bes:如果你的域對象上有一個非持久的'CommentCount'屬性,你可以讓你的存儲庫用類似Jayantha建議的查詢填充該屬性,並返回一個實體。 –

+0

我已經添加了一些解決方法 –