0

我有作为Azure Web角色托管的MVC应用程序,我也有工作人员角色,它检查一些数据并更新数据库中的记录。工人角色每15分钟检查一次数据。实体框架恢复更改

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

我会尽力举一个例子:

  1. 用户做出的一个实体变更昨天(这是由事件日志跟踪)

  2. 在此期间,工人的角色更新的实体

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

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

MVC应用程序使用简单的SaveChanges函数,而工作人员角色使用带有SaveChanges的BeginTransaction。

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

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

感谢

+0

您是否将EF数据库上下文持久存储在某处(如属性),还是声明了新数据库然后为每个数据库操作进行处理? –

+0

是的,在工人角色 –

回答

1

如果你保持在你的Worker角色的持久EF数据库上下文,很可能你看到的EF对象的影响被缓存。

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

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

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

Entity Framework and Connection Pooling,具体而言,

当你每方面使用EF默认情况下它负载的每一个实体只有一次。 第一个查询创建实体实例并将其存储在内部。随后的查询要求具有相同密钥的实体返回此 存储的实例。如果数据存储中的值发生更改,您仍然收到来自初始查询值的实体 。

底线是,你永远不应该坚持的EF数据库上下文的很长一段时间。你可能认为它只是一个开放的数据库连接,但它远不止于此,并且通过保持它来“优化”事物是一种虚假的节省,并且会导致不好的事情发生。它意味着在你创建它的UoW模式中使用,做什么操作需要完成,然后尽快处理它。