实体框架可以恢复更改

时间:2015-10-06 21:16:44

标签: sql-server asp.net-mvc entity-framework transactions ef-code-first

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

昨天,我遇到了大麻烦,因为通过MVC应用程序进行的很多更改都被恢复了。

我将尝试举例:

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

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

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

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

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

    我怀疑锁定和隔离级别,但锁定差不多24小时很奇怪。

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

    由于

1 个答案:

答案 0 :(得分:1)

如果您在工作者角色中保留持久性EF数据库上下文,则可能会看到正在缓存的EF对象的影响。

  1. 辅助角色加载实体并对其执行某些操作。由于您每次都没有创建和处理EF上下文,因此实体会保持缓存状态。

  2. 用户保存实体,数据库会随着更改而更新。

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

  4. 请参阅Entity Framework and Connection Pooling,具体而言,

      

    当您使用EF时,默认情况下,每个上下文仅加载一个实体。   第一个查询创建实体实例并在内部存储它。任何   后续查询需要具有相同键的实体返回此项   存储的实例。如果数据存储中的值发生了更改,则仍会收到   具有初始查询值的实体。

    最重要的是,您永远不应该长时间持久保存EF数据库上下文。您可能会认为它只是一个开放的数据库连接,但它远不止于此而且"优化"保持它的东西是一种虚假的储蓄,会导致坏事发生。它意味着用于你创建它的UoW模式,做需要完成的操作,然后尽快处理它。