C#MVC仅使用Entity Framework保存视图模型的已更改元素

时间:2014-10-03 17:56:28

标签: asp.net-mvc entity-framework asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel

我有一个项目,多个用户可以同时查看同一页面的数据,并对其进行更改。因此,将发生丢失的更新问题。

我想知道是否有任何框架或模式可以优雅地处理这个问题。因此,如果有人只更改了视图模型中的一个字段,我只想更新数据库中的这一列。

目前,我将视图模型发布回控制器,验证,然后自动化到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,这将避免这个问题?

2 个答案:

答案 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吗?只有人才能确定这一点。