2012-02-29 44 views
1

我有一個項目結構如下: .Persistence - >內的.repo - >。服務 - > .Controllers - > MVC3應用。EF4:爲什麼啓用延遲加載時必須啓用代理創建?

每層具有與接口的相應的組件和有也有一些其他組件等.Entities,.ViewModels,和共同的代碼組件。

持久性 - 這包含EF4 datacontext(代碼優先)和對EF4.3的引用。有一個工廠用於創建稱爲GetContext()的Context,並且該工廠實現了IDisposable。這不是一個單身人士的原因,我認爲這是Windsor對LifestyleSingleton()所做的一切。
回購 - 這適用實施庫和規範圖案(http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/)庫。啓用時延遲加載
1.爲什麼代理的創建已啓用:

其它層是不言自明......

問題?
2.如果我想設置惰性加載=假,我可以投我在服務層的IEnumerable到的ObjectQuery才能使用.INCLUDE()呢?

回答

4

爲什麼代理的創建已被啓用時,延遲加載啓用?

因爲使用POCO進行延遲加載依賴於代理創建。沒有代理懶惰加載不起作用。因此組合ProxyCreationEnabled = falseLazyLoadingEnabled = true是沒有意義的。如果您想使用更改跟蹤代理但不想使用延遲加載,則反向組合是有意義的。

如果我想設置lazyloading = false,我可以將我的IEnumerable服務層轉換爲ObjectQuery以便使用.Include()嗎?

這取決於你IEnumerable<T>真正。如果它是一個ToList()那麼沒有結果(因爲List<T>IEnumerable<T>實現但不是IQueryable<T>)。如果你只是返回一個IQueryable<T>作爲IEnumerable<T>你可能會投到IQueryable<T>。 (在EF 4.3你可以使用IQueryable<T>DbQuery<T>而非ObjectQuery<T>。)

但恕我直言,需要這樣一個鑄表示,什麼是錯在你的架構。使用Include是對查詢的修改。如果您的服務層允許修改查詢,您的存儲庫應該返回IQueryable<T> - 此類型用於構建和修改查詢。

如果你的倉庫不應該返回IQueryable<T>你必須通過一個表達式或者技術指標成用於將Include添加到您的查詢庫方法 - 庫法的內部,而不是在服務層。

+0

謝謝。我同意你關於不在服務層使用include的問題。 至於使用DbQuery不是ObjectQuery,你知道爲什麼DbQuery沒有。哪裏(字符串)重載,如「it.ID> 2」接收實體sql值?此外,我想不必在我的回購項目中引用EntityFramework(大約2mb),所以如果我使用System.Data.Entity命名空間(框架的一部分)中的ObjectQuery,我可以避免這樣做...使用ObjectQuery而不是DbQuery有什麼不利嗎? – diegohb 2012-03-01 00:19:30

+1

@diegohb:實體SQL ist不支持'DbContext',這就是爲什麼沒有字符串重載'Where'。如果你想使用ObjectQuery,你可以使用'IObjectContextAdapter'(你知道嗎?)從'DbContext'中取出ObjectContext。但除非你真的想要使用實體SQL,否則我建議堅持使用'DbContext'並且引用EntityFramework.dll。否則根本沒有理由使用'DbContext',那麼你可以使用EF 4.0。 – Slauma 2012-03-01 11:03:51

+0

謝謝!是的,我知道關於objectcontextadapter。我的用戶界面使用jqGrid組件,它提供過濾功能,我打算將過濾參數轉換爲字符串查詢以傳遞給我的服務人員,他們顯然需要將其傳遞給repo(可以訪問ObjectContextAdapter和DbContext)爲了使用ESQL Where overload ...我真的不想在我的UI中爲EntityFramework.dll做一個硬引用,只是爲了使用這一個重載,而我更願意堅持使用DbContext。如果你看過huyrua的鏈接,我將需要重載所有的GenericRepo方法。 – diegohb 2012-03-01 13:47:09

相關問題