2011-02-23 58 views
1

如果我們手動構建我們的關聯,我們將不得不在我們的域模型中公開外鍵?DDD和實體框架 - 手動建立關聯

例如,如果我檢索所有產品和所有類別,我可以手動構建Product.Categories屬性的唯一方法是如果我在模型中公開ProductCategory映射嗎?

我寧可不這樣做,如果有替代方案(請注意,通過EF急切加載不是一個選項,因爲我有兩個許多關聯加載)。

+0

你打算如何公開這些關聯? – CarneyCode 2011-02-23 17:53:58

+0

這些關聯仍然存在,它們不會被EF加載。默認情況下,沒有必要公開映射表,但我認爲可能需要手動加載關聯。 – 2011-02-23 22:00:20

回答

0

解決方案是使用Linq投影來檢索相關的鍵。

var tags = (from p in postRepo.GetAll() 
     from t in p.Tags 
     select new 
     { 
      PostId = p.Id, 
      Tag = t 
     }).Take(1000).ToList(); 

我將上述查詢的結果粘貼到List<KeyValuePair<Guid, Tag>>中,然後將其緩存。當我加載一篇文章時,我可以從緩存中手動構建它的「標籤」集合。

這是我們現在不得不採取的一種方法。雖然延遲加載非常方便,恕我直言,它不應該與您的意見。

通過使用上述方法緩存常見關聯,我們能夠將先前發出59個查詢(由於延遲加載)的頁面減少爲6個查詢。

0

您可以在項目中添加一個部分類「Product」,並使用IEnumerable<Category>屬性「Categories」(甚至返回IEnumerable<Category>的方法)擴展您的「Product」實體。

這樣你就可以自己實現「Categories」的檢索。

+0

我不需要這樣做。產品已具有類別屬性。我的觀點(和問題)是,是否需要在我的域模型中公開外鍵/映射表以便手動加載關聯屬性,我認爲答案可能是肯定的。 – 2011-02-23 22:01:52