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

时间:2012-08-02 18:55:14

标签: c# .net sql-server entity-framework entity-framework-4

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();
    
  4. e.Name是之前的值,但n是最新的。

    我们在呼叫之间重复使用相同的上下文。

    使用SQL分析器,我可以确认即使数据是陈旧的,也会发生来自EF的SQL查询。

    导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:2)

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

context.MergeOption = MergeOption.OverwriteChanges

答案 1 :(得分:1)

这是因为您正在使用默认上下文合并选项MergeOption.AppendOnly。此选项基本上告诉底层上下文结构永远不会用来自数据源查询的新值替换现有实体。

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

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

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