如果我們手動構建我們的關聯,我們將不得不在我們的域模型中公開外鍵?DDD和實體框架 - 手動建立關聯
例如,如果我檢索所有產品和所有類別,我可以手動構建Product.Categories屬性的唯一方法是如果我在模型中公開ProductCategory映射嗎?
我寧可不這樣做,如果有替代方案(請注意,通過EF急切加載不是一個選項,因爲我有兩個許多關聯加載)。
如果我們手動構建我們的關聯,我們將不得不在我們的域模型中公開外鍵?DDD和實體框架 - 手動建立關聯
例如,如果我檢索所有產品和所有類別,我可以手動構建Product.Categories屬性的唯一方法是如果我在模型中公開ProductCategory映射嗎?
我寧可不這樣做,如果有替代方案(請注意,通過EF急切加載不是一個選項,因爲我有兩個許多關聯加載)。
解決方案是使用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個查詢。
您可以在項目中添加一個部分類「Product」,並使用IEnumerable<Category>
屬性「Categories」(甚至返回IEnumerable<Category>
的方法)擴展您的「Product」實體。
這樣你就可以自己實現「Categories」的檢索。
我不需要這樣做。產品已具有類別屬性。我的觀點(和問題)是,是否需要在我的域模型中公開外鍵/映射表以便手動加載關聯屬性,我認爲答案可能是肯定的。 – 2011-02-23 22:01:52
你打算如何公開這些關聯? – CarneyCode 2011-02-23 17:53:58
這些關聯仍然存在,它們不會被EF加載。默認情況下,沒有必要公開映射表,但我認爲可能需要手動加載關聯。 – 2011-02-23 22:00:20