1

对于在实体框架中始终保持数据完整性的最佳方法,是否有任何共识。即在添加或删除实体时,如何确保加载的模型是最新的,并且我背后的数据库没有任何变化?

在大多数情况下似乎对我有用的粗略方法是在会话之间重新加载上下文,即没有持久模型,并在出现错误时重新加载/刷新。这似乎在低数据冲突的情况下有效,但是当不同服务中发生大量更改时成本非常高。是否有一个标志可以查询磁盘上的数据/行是否已更改或是否有事件使此刷新自动进行,即更新某些表/行的任何订阅者?

4

2 回答 2

2

您可能需要乐观并发。EF 可以在提交之前自动检查数据的任何更改,如果数据在当前上下文之外发生更改,则抛出异常。请参阅http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

于 2012-11-06T21:26:50.017 回答
0

您可以在 EF 中使用并发做一些很酷的事情。

具体来说,我有一个属性 HandleConcurrencyExceptionAttribute,您可以在 MVC 项目中使用它来自动挂钩实体框架将抛出​​的 DbConcurrencyException。 https://github.com/adamtuliper/EF5-for-Real-Web-Applications

如果您使用 Web 表单(或 win forms/wpf),则必须手动检查它。在 Webforms 项目中搜索 DbConcurrencyException

所以基本上:

  1. 在数据库中有一个rowversion字段,称之为'timestamp'
  2. 将您的实体字段设置为具有 [时间戳]

[Timestamp] public byte[] Timestamp { get; set; }

  1. 保存时 EF 将确保正在更新的行具有当前时间戳。如果更新的行数 = 0,则会引发异常,因为该行不再存在或已被修改,并且 SQL Server 在最后一个人保存更改时自动增加行版本。

如果您想看到它的实际效果,请查看我的视频结尾:http ://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/DEV215 我简要地讨论了并发性并进行了快速演示。

对于您问题的第二部分,有 SqlCacheDependency 类 http://msdn.microsoft.com/en-us/library/ms178604(v=vs.100).aspx 最近在 MSDN 上也有一篇关于此的文章好。

于 2012-11-06T22:01:04.633 回答