实体框架在选择整个实体时返回陈旧数据,但在仅选择字段时返回最新数据

本文关键字:实体 数据 返回 选择 字段 最新 框架 陈旧 | 更新日期: 2024-09-08 12:03:50

My Entity Framework支持的项目在选择整个实体时返回过时的数据,但在仅从实体中选择一个字段时,数据是最新的。

以下是步骤:

  1. 通过EF/LINQ查询:

    var e  = context.myEntity.First(x=>x.ID==ID);
    string n = context.myEntity.Where(x=>x.ID==ID).Select(x=>x.Name).First();
    
  2. 通过SQL直接更新数据库中的名称字段

  3. 然后通过EF/LINQ再次查询:

    var e  = context.myEntity.First(x=>x.ID==ID);
    string n = context.myEntity.Where(x=>x.ID==ID).Select(x=>x.Name).First();
    

e.Name是以前的值,但n是最新的。

我们在两次通话之间重复使用相同的上下文。

使用SQL探查器,我可以确认,即使数据过时,也会发生来自EF的SQL查询。

是什么原因造成的?

实体框架在选择整个实体时返回陈旧数据,但在仅选择字段时返回最新数据

数据缓存在上下文中。理想情况下,您的上下文应该具有较短的生存期(例如,一个工作单元),以防止这种行为成为问题,但如果您需要强制从数据库进行更新,请将MergeOption设置为OverwriteChanges

context.MergeOption = MergeOption.OverwriteChanges

之所以会发生这种情况,是因为您使用了默认的上下文合并选项MergeOption.AppendOnly。这个选项基本上告诉底层上下文结构永远不要用来自数据源查询的新值替换现有实体。

不过,你还有其他选择,我建议阅读下面的内容,看看其他选择是否更适合你想要的场景。

http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

听起来你最好的选择可能是MergeOption.PreserveChanges