Entity Framework 还原更改

Entity Framework reverts changes

我将 MVC 应用程序托管为 Azure Web 角色,并且我还有 Worker 角色,它检查一些数据并更新数据库中的记录。工作者角色每 15 分钟检查一次数据。

昨天,我遇到了大麻烦,因为通过 MVC 应用程序所做的很多更改都被还原了。

我会试着举个例子:

  1. 用户昨天对一个实体进行了更改(这由事件日志跟踪)

  2. 与此同时,工作者角色更新了该实体

  3. 今天,用户多次更新实体

  4. 最后,实体有昨天的数据,而不是今天的数据

MVC 应用程序使用简单的 SaveChanges 函数,而辅助角色使用带有 SaveChanges 的 BeginTransaction。

我怀疑锁定和隔离级别,但奇怪的是锁定几乎是 24 小时长。

希望有人能理解并帮助我。

谢谢

如果您在辅助角色中保留持久的 EF 数据库上下文,您可能会看到缓存 EF 对象的效果。

  1. 工作者角色加载一个实体并用它做一些事情。由于您不是每次都创建和处理 EF 上下文,因此实体会保持缓存状态。

  2. 用户保存实体,数据库随他们的更改更新。

  3. 工作者角色再次查询实体,但由于它已将其缓存 returns 过时的缓存版本。它执行某种保存操作,用缓存值覆盖用户的编辑。

参见Entity Framework and Connection Pooling,具体来说,

When you use EF it by default loads each entity only once per context. The first query creates entity instace and stores it internally. Any subsequent query which requires entity with the same key returns this stored instance. If values in the data store changed you still receive the entity with values from the initial query.

最重要的是,永远不要长时间保留 EF 数据库上下文。您可能认为它只是一个开放的数据库连接,但它远不止于此,"optimizing" 保留它是一种错误的节省,会导致不好的事情发生。它旨在用于创建它的 UoW 模式,执行需要完成的操作,然后尽快处理它。