实体框架中的数据完整性

时间:2012-11-06 21:23:56

标签: c# sql-server entity-framework

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

在大多数情况下似乎对我有用的粗略方法是在会话之间重新加载上下文,即不具有持久模型,并在发生错误时重新加载/刷新。这似乎适用于数据冲突较少的情况,但是当在不同服务中发生大量更改时,这种情况非常昂贵。是否有一个标志来查询磁盘上的数据/行是否已更改或事件是否自动刷新,即更新某些表/行的任何订户?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

如果您使用网络表单(或赢取表单/ wpf),则必须手动检查它。在webforms项目中搜索DbConcurrencyException

基本上是这样的:

  1. 在db中有一个rowversion字段,称之为'timestamp'
  2. 将您的实体字段设置为[时间戳记]
  3. [Timestamp] public byte[] Timestamp { get; set; }

    1. 保存EF后,将确保正在更新的行具有当前时间戳。如果更新的行数= 0,则它会抛出异常,因为该行不再存在或被修改,并且当最后一个人保存更改时,SQL Server会自动增加rowversion。
    2. 如果您想看到它的实际效果,请参阅我的视频结尾:http://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/DEV215 我简要地讨论了并发性并进行了快速演示。

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