0

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

以下是步骤:

  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 查询也会发生。

什么会导致这种情况?

4

2 回答 2

2

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

context.MergeOption = MergeOption.OverwriteChanges
于 2012-08-02T19:03:52.737 回答
1

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

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

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

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

于 2012-08-02T19:10:11.867 回答