1

我有一個項目,其中多個用戶可能同時查看同一頁數據並對其進行更改。因此,丟失的更新問題將會發生。C#MVC僅使用Entity Framework保存視圖模型的已更改元素

我想知道是否有任何框架或模式可以遵循,這將優雅地處理。所以如果有人只更改視圖模型中的一個字段,我想只更新數據庫中的這一列。

當前我發佈視圖模型回控制器,驗證,然後自動映射到實體框架類。

作爲一個適當的例子,比方說我的視圖模型如下:

public class MyViewModel 
{ 
    public int Id { get; set; } 
    public int Num1 { get; set; } 
    public int Num2 { get; set; } 
} 

只有1在數據庫中一行如下:

Id = 1 
Num1 = 10 
Num2 = 20 

這就被讀入的觀點模型何時加載頁面。

如果A人和B人同時使用網站瀏覽此記錄,他們的屏幕上分別有Num1和Num2分別爲10和20。

人A將Num1設置爲15並按下保存。

然後人B將Num2更改爲25並按下保存。然而,由於整個視圖模型被保存,所以人A的Num1 = 15的變化會丟失並被人B的記錄覆蓋10。

有沒有人有任何web框架,他們可以推薦哪個計劃很好地與MVC,這將避免這個問題?

+0

你可以按照建議在這個環節 http://stackoverflow.com/questions/833/editing-database-records-by-multiple-users – 2014-10-03 18:52:39

+0

沒有任何的建議,解決問題了嗎? – 2014-10-07 13:39:47

+0

不是真的,但有一天晚上一些進一步的研究拋出了這個有趣的文章:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the- entity-framework-in-an-asp-net-mvc-application – 2014-10-07 13:51:09

回答

1

最好的解決辦法可能是使用類似SignalR更新其他用戶的對象模型更新:http://signalr.net/

沒有太多的麻煩,更簡單的/較粗略的實施可能會是這種效果:

public class MyViewModel 
{ 
    public int Id { get; set; } 
    public int Num1 { get; set; } 
    public int Num2 { get; set; } 
    public int Num1Orig { get; set; } 
    public int Num2Orig { get; set; } 
} 

在視圖中包含_Orig作爲隱藏字段。然後在您的帖子上,從數據庫中獲取當前對象,將新模型值與_Orig值進行比較,並僅在更改實體對象時更新實體對象。

+0

這是最後獲勝數據持久性介質的教科書答案。 – 2014-10-03 19:14:30

0

解決此問題的另一種方法是將您的系統從基於CRUD的系統中刪除。

這些工具的一些例子:

命令體系結構/ CQRS

事件採購:

這裏有一個關於事件採購/ CQRS相當101條http://simon-says-architecture.com/2011/01/15/probably-the-most-powerful-cqrsevent-sourcing-platform-in-net/有關這些主題的更多信息可以在這裏通過搜索這些概念被發現。

通過轉移到構建於其上的體系結構,您將發送更多重點對象。你說人A更新Num1和人B更新Num2,那些顯示這些可能是離散的邊界,你應該有一個單獨的命令更新Num1與Num2。除非你打算在某個點上逐字段地實現這些解決方案,否則你不得不接受併發訪問,除非涉及人爲合併過程,否則無法解決。

如果用戶A將Num1更新爲5並且用戶B將Num更新爲10,那麼Num1爲0什麼是正確的答案?它是5嗎?是10嗎?是15嗎?只有一個人可以確定這一點。

相關問題