【问题标题】:Refreshing Data Using Entity Framework使用实体框架刷新数据
【发布时间】:2011-05-25 15:19:47
【问题描述】:

我正在尝试使用实体框架来查询数据库,并且我有以下代码用于获取一些数据。

var students= MyEntities.Students.Where(s => s.Age > 20).ToList();

此代码工作正常并返回正确的数据。但是,如果我运行此代码,然后转到数据库并更新记录以更改此代码应返回的数据,然后在不关闭应用程序的情况下重新运行此代码,我将获得原始数据。 我很确定它以前可以正常工作,但现在它不会刷新数据。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    不,它从来没有工作过。这是实体框架(和许多 ORM 工具)的基本行为,称为身份映射 (explanation here)。

    如果您在同一上下文中运行查询,您将不会更新您的实体。它只会在运行这两个查询之间附加在数据库中创建的新实体。如果您想强制 EF 重新加载实体,您必须执行以下操作:

    ObjectQuery query = MyEntities.Students;
    query.MergeOption = MergeOption.OverwriteChanges;
    var students = query.Where(s => s.Age > 20).ToList();
    

    【讨论】:

    • 如果你只是查询你应该使用MergeOption.NoTracking ?这将强制查询命中数据库。
    • 无论如何查询都会命中数据库。我不确定当您使用 NoTracking 并且“缓存”中已经有实体时会发生什么,因为使用延迟加载时 EF 仍然保留它们。
    • 这似乎做了我想做的事。使用 Refresh() 方法也可以,但我认为使用 ObjectQuery 是一种更清洁的解决方案。将此标记为答案。然而,Nix 在使用 EF 时提出了一个关于最佳实践的好观点,这将是很好的了解更多信息,所以我需要更多地研究它。
    【解决方案2】:

    您遇到问题是因为 EF 缓存数据,因此如果数据在后台发生更改,并且您不处置/重新打开上下文,您将遇到问题。

    一般的经验法则是尽可能缩短上下文的生命周期,以规避您刚才提到的问题。

    请不要忽略我上面所说的,但如果您想强制从数据库刷新,您可以使用Refresh() 方法。

    【讨论】:

    • 请注意,除了可能会或可能不会执行的实际查询之外,刷新正在对更大的数据集进行许多查询,而 query.MergeOption 只是强制从数据库中读取查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2011-02-03
    • 2017-11-12
    • 2015-06-02
    相关资源
    最近更新 更多