0

我有作爲Azure Web角色託管的MVC應用程序,我也有工作人員角色,它檢查一些數據並更新數據庫中的記錄。工人角色每15分鐘檢查一次數據。實體框架恢復更改

昨天,我遇到了很大的麻煩,因爲很多通過MVC應用程序所做的更改都恢復了。

我會盡力舉一個例子:

  1. 用戶做出的一個實體變更昨天(這是由事件日誌跟蹤)

  2. 在此期間,工人的角色更新的實體

  3. 今天,用戶更新實體多次

  4. 最後,實體有來自昨天的數據,而不是來回m今天

MVC應用程序使用簡單的SaveChanges函數,而工作人員角色使用帶有SaveChanges的BeginTransaction。

我懷疑是鎖定和隔離級別,但奇怪的是,鎖幾乎是24小時。

我希望有人能理解這一點並幫助我。

感謝

+0

您是否將EF數據庫上下文持久存儲在某處(如屬性),還是聲明瞭新數據庫然後爲每個數據庫操作進行處理? –

+0

是的,在工人角色 –

回答

1

如果你保持在你的Worker角色的持久EF數據庫上下文,很可能你看到的EF對象的影響被緩存。

  1. 工作者角色加載一個實體並對它做某事。由於您每次都不創建和處理EF上下文,因此實體保持緩存狀態。

  2. 用戶保存實體,數據庫隨其更改而更新。

  3. 再次爲實體提供工作角色查詢,但是由於它被緩存,它將返回過期的緩存版本。它執行某種保存操作,用緩存的值覆蓋用戶的編輯。

Entity Framework and Connection Pooling,具體而言,

當你每方面使用EF默認情況下它負載的每一個實體只有一次。 第一個查詢創建實體實例並將其存儲在內部。隨後的查詢要求具有相同密鑰的實體返回此 存儲的實例。如果數據存儲中的值發生更改,您仍然收到來自初始查詢值的實體 。

底線是,你永遠不應該堅持的EF數據庫上下文的很長一段時間。你可能認爲它只是一個開放的數據庫連接,但它遠不止於此,並且通過保持它來「優化」事物是一種虛假的節省,並且會導致不好的事情發生。它意味着在你創建它的UoW模式中使用,做什麼操作需要完成,然後儘快處理它。