2011-04-19 102 views
4

我在新項目中將實體框架4.1與POCO實體結合使用。一切工作正常,直到我開始使用AppFabric Caching緩存實體。我開始從緩存中檢索與反序列化代理對象相關的內容。我通過設置ContextOptions.ProxyCreationEnabled = false解決了這個問題。 現在的問題是,當我從緩存中取回實體時,我必須使用ObjectSet.Attach(實體)將實體附加到當前上下文,並使用將它們添加到狀態管理器ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified)以編程方式啓用/禁用實體代理

我的問題是有沒有一種方法來編程啓用/禁用一組實體的代理?或者換句話說就是一種將反序列化的實體包裝在代理對象中的方法。

如果沒有一個好的方法來做到這一點,我現在的做法是否正確?或者,還有更好的方法?

回答

7

您正在以正確的方式使用它。以編程方式啓用或禁用代理創建的唯一方法是將ContextOptions.ProxyCreationEnabled設置爲falsetrue,就像您現在所做的那樣。

我不認爲有辦法將反序列化的實體包裝到代理對象中。問題在於代理是動態創建的類型(=在運行時創建的類型),從您的實體類型派生而來。因此,如果將它反序列化爲實體類型,則不能將其轉換爲其他類型。

什麼可能工作是使用代理但禁用LazyLoading(也在ContextOptions)並手動將實體從加載它們的上下文中分離出來。但它會打破所有的關係,你仍然必須將實體附加到新的上下文並設置其狀態。另一種可行的解決方案是創建新實體context.CreateObject並將所有數據從緩存實體複製到新實體,但這是我不喜歡的解決方案。

換句話說:一旦你使用分離的實體,你必須手動處理附加和設置狀態。如果您打算撥打change relations,情況會更糟糕。

Btw。你提到使用EFv4.1,但你使用的所有東西是EFv4。 EFv4.1沒有對ObjectContext API進行任何更改,它添加了不同的DbContext API,因此除非您將DbContext重新設置爲ObjectContext,否則您正在使用EFv4。如果您將DbContext轉換回ObjectContext那麼您應該檢查DbContext API,因爲它提供了等效的AttachChangeObjectState =>DbSet.Attachcontext.Entry(entity).State

+0

謝謝!我只是不確定我是否正確使用它。 – 2011-04-22 16:51:15