实体框架恢复更改
我有作为Azure Web角色托管的MVC应用程序,我也有工作人员角色,它检查一些数据并更新数据库中的记录。工人角色每15分钟检查一次数据。实体框架恢复更改
昨天,我遇到了很大的麻烦,因为很多通过MVC应用程序所做的更改都恢复了。
我会尽力举一个例子:
用户做出的一个实体变更昨天(这是由事件日志跟踪)
在此期间,工人的角色更新的实体
今天,用户更新实体多次
最后,实体有来自昨天的数据,而不是来回m今天
MVC应用程序使用简单的SaveChanges函数,而工作人员角色使用带有SaveChanges的BeginTransaction。
我怀疑是锁定和隔离级别,但奇怪的是,锁几乎是24小时。
我希望有人能理解这一点并帮助我。
感谢
如果你保持在你的Worker角色的持久EF数据库上下文,很可能你看到的EF对象的影响被缓存。
工作者角色加载一个实体并对它做某事。由于您每次都不创建和处理EF上下文,因此实体保持缓存状态。
用户保存实体,数据库随其更改而更新。
再次为实体提供工作角色查询,但是由于它被缓存,它将返回过期的缓存版本。它执行某种保存操作,用缓存的值覆盖用户的编辑。
见Entity Framework and Connection Pooling,具体而言,
当你每方面使用EF默认情况下它负载的每一个实体只有一次。 第一个查询创建实体实例并将其存储在内部。随后的查询要求具有相同密钥的实体返回此 存储的实例。如果数据存储中的值发生更改,您仍然收到来自初始查询值的实体 。
底线是,你永远不应该坚持的EF数据库上下文的很长一段时间。你可能认为它只是一个开放的数据库连接,但它远不止于此,并且通过保持它来“优化”事物是一种虚假的节省,并且会导致不好的事情发生。它意味着在你创建它的UoW模式中使用,做什么操作需要完成,然后尽快处理它。
您是否将EF数据库上下文持久存储在某处(如属性),还是声明了新数据库然后为每个数据库操作进行处理? –
是的,在工人角色 –