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吗?只有一个人可以确定这一点。

相关问题