反映

1

我使用SimpletInjector通過存儲過程在EF上下文所做的更改使用以下代碼來注入entity framework上下文中控制器:反映

private static void Initializer(Container container) 
    { 
     container.RegisterSingle<IDbContext, SpotterContext>(); 
     container.RegisterSingle<IUnitOfWork, UnitOfWork>(); 
    } 

我使用的注入上下文中執行的存儲過程,其將僅具有UPDATE或使用下面的代碼DELETE聲明:

context.Database.ExecuteSqlCommand(<spname>, <params array>);   

我現在面臨的問題是,通過在數據庫中的存儲過程中所做的更改都沒有得到體現在上下文nd當使用上下文訪問更新的數據時,我得到的是舊數據而不是更新數據。

如何在執行存儲過程以從數據庫獲取最新數據後更新context

+1

閱讀[本](http://stackoverflow.com/a/10588594/1515209) - 你不應該真的註冊上下文作爲一個單身。 – qujck 2014-10-17 12:19:42

+0

請注意,@qujck是獨佔的,而您的問題是由於使用dbcontext作爲單例造成的。使用Reload方法可能看起來像解決了您的問題,但正如qujck的鏈接所解釋的,dbcontext不能用於跨線程和請求。 – Steven 2014-10-19 14:52:36

回答

1

最近必須解決完全相同的問題。看起來,Reload()方法的上下文'Entry成員工作得很好。

對不起,我不知道C#,所以不能發佈該語言的代碼示例。在VB.NET中,它看起來像這樣:

Dim CurClient As Client = Ctx.Clients.Where(Function(cl) cl.Id = ClientId).First() 

Ctx.Entry(Of Client)(CurClient).Reload() 

這裏,Ctx是EF上下文。

我還沒有測試過的唯一的事情是這個方法是否也從子表中重新加載記錄,如果它們存在的話。

+0

我真的很感謝你給出的答案,但我有一個關於它的問題。 「重新加載」調用是否會摺疊由其他用戶設置的現有實體狀態並從數據庫加載數據?例如:用戶1已將一個實體狀態設置爲「已修改」,然後用戶2進入並執行存儲過程並稱爲「重新加載」,那麼用戶1實體狀態在「重新加載」後仍然不受影響或者這些更改將丟失。 – Manikandhar 2014-10-17 15:08:12

+0

@Manikandhar,這取決於你有多少上下文。如果這些用戶每個都有個人上下文,則User1在其個人上下文中所做的更改將不受影響。如果多個用戶共享相同的EF環境,那麼是的,User1的變化將會丟失。 – 2014-10-18 04:12:13

+0

非常感謝羅傑,你指出的解決方案爲我解決。再次感謝...! – Manikandhar 2014-10-20 04:49:25