.net 确定数据库中的实体数据何时更改的好方法是什么?

.net 确定数据库中的实体数据何时更改的好方法是什么?,.net,entity-framework,concurrency,.net,Entity Framework,Concurrency,比如说,使用实体框架,我从数据库中检索了一个实体。是否有任何方法可以随后检查数据库中的同一特定实体是否已被其他用户更改 我以前(在WinForm应用程序中)使用的方法是: 将实体保存到数据库 将实体类型、唯一标识符和日期时间已更改的条目添加到事务表中 刷新同一实体时,检查当前用户保存后事务表中的行 如果找到条目,则相应地采取行动(从数据库重新加载实体、块编辑、保存冲突等,具体取决于我检查更改的原因) 我想这样做的原因是: 避免重新加载整个实体集,只刷新已更改的实体 检查保存时是否存在并发冲

比如说,使用实体框架,我从数据库中检索了一个实体。是否有任何方法可以随后检查数据库中的同一特定实体是否已被其他用户更改

我以前(在WinForm应用程序中)使用的方法是:

  • 将实体保存到数据库
  • 将实体类型、唯一标识符和日期时间已更改的条目添加到事务表中
  • 刷新同一实体时,检查当前用户保存后事务表中的行
  • 如果找到条目,则相应地采取行动(从数据库重新加载实体、块编辑、保存冲突等,具体取决于我检查更改的原因)
我想这样做的原因是:

  • 避免重新加载整个实体集,只刷新已更改的实体
  • 检查保存时是否存在并发冲突
  • 解决基于编辑开始时的并发冲突。要做到这一点,我需要在用户开始编辑时在事务表中创建一个条目,并在用户保存/取消时更新同一事务表行

这个方法似乎正确吗?这样做的理由是正确的吗?也许已经有一些功能可以做到这一点,但我还没有找到

我想知道为什么不使用一种更标准的乐观并发方式。英孚对此有何看法。我认为单独的事务表只会增加复杂性,因为在对主要实体执行CRUD操作时,您总是必须显式维护该表中的条目。当用户开始编辑并在事务表中创建“锁定”条目,但随后崩溃时会发生什么?在这里,对数据库中的记录使用独占锁(即悲观锁)是否合适


您还可以使用此方法检查中间更改,因为您可以在时间戳或版本列上执行简单的查询。

对不起,check on Edit的措辞很糟糕,您已经编辑了问题。EF ObjectContext.Refresh和工作单元模式的问题是:如果我在整个应用程序中使用了一组“引用”对象,并且它们不会经常更改,那么为什么要从数据库中重新加载这些对象呢?此外,使用时间戳/版本列肯定比将信息存储在单独的表中效率低。但归根结底,你是对的,除非我有充分的理由,否则我应该使用标准EF并发,而不是使用我自己的。通常情况下,你会通过一个短期的ObjectContext从数据库中获取这些不可变的引用数据,然后它们独立地存在于你的应用程序中。至于你的第二点:效率较低?更新在一条记录上,而不是在两条记录上。无论如何,是的,DBMS在事务管理方面可能比你和我更好。呵呵,但问题是参考数据不是完全不可变的。。。多个客户端只读取一个事务表来确定更改,这就抵消了更新工作的加倍。考虑到通过管理您自己的并发性所获得的收益几乎不超过使用广泛使用的DBMS所带来的好处,我认为您的答案是正确的。谢谢你的评论。