我有一个项目,多个用户可以同时查看同一页面的数据,并对其进行更改。因此,将发生丢失的更新问题。
我想知道是否有任何框架或模式可以优雅地处理这个问题。因此,如果有人只更改了视图模型中的一个字段,我只想更新数据库中的这一列。
目前,我将视图模型发布回控制器,验证,然后自动化到Entity Framework类。
作为一个恰当的例子,假设我的视图模型如下:
public class MyViewModel
{
public int Id { get; set; }
public int Num1 { get; set; }
public int Num2 { get; set; }
}
数据库中只有一行如下:
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 :(得分: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值进行比较,并仅在实体对象发生更改时更新。
答案 1 :(得分:0)
此问题的另一个解决方案是将您的系统从基于CRUD的系统中删除。
这些工具的一些例子:
命令架构/ CQRS
事件采购:
这是一篇关于事件采购/ CQRS {101}的101篇文章,可以通过搜索这些概念找到更多有关这些主题的信息。
通过迁移到基于这些构建的体系结构,您将发送更多焦点对象。你说的是人A更新Num1和人B更新Num2,那些显示那些可能是离散的边界,你应该有一个单独的命令来更新Num1和Num2。除非您打算逐个字段地实现这些解决方案,否则您必须接受并发访问,除非涉及人工合并过程,否则无法解决。
Num1为0,如果用户A将Num1更新为5而用户B将Num更新为10,那么正确的答案是什么?是5吗?是10吗?是15吗?只有人才能确定这一点。