代码之家  ›  专栏  ›  技术社区  ›  Matt

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

  •  1
  • Matt  · 技术社区  · 12 年前

    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查询。

    是什么原因造成的?

    2 回复  |  直到 12 年前
        1
  •  2
  •   podiluska    12 年前

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

    context.MergeOption = MergeOption.OverwriteChanges
    
        2
  •  1
  •   EkoostikMartin    12 年前

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

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

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

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