gpt4 book ai didi

c# - SaveChanges 获取旧值后 Entity Framework 读取

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:02 28 4
gpt4 key购买 nike

我正在使用 Entity Framework 5.0 和 SQLite 数据库。我有一个场景,我对数据库记录进行了修改,然后我使用同一个表的实体对象的新实例来读取同一条记录,但我得到了旧值。在调试时,如果我转到我的数据库工具并查看记录,更改就在那里,但 EF 没有拾取它们。它最终会在稍后接收它们,但我无法确定那是什么时候。

这是代码片段。首先,我使用 SaveChanges() 执行更新:

tblTest efTestTbl = context.tblTests.Find(recID);
context.tblTests.Attach(efTestTbl);
efTestTbl.Value1 = "newValue"; // This changed it from "oldValue" :-)
int changedRecs = context.SaveChanges();

上面的这段代码似乎总是有效并将更改保存到数据库中。 changedRecs 最终等于 1。我可以在代码中的这一点之后停下来,使用我的数据库工具查看数据库中的值,该列将等于“newValue”。

现在,如果我执行以下读取,在上一次更新后直接使用不同的表对象,但上下文对象的实例相同:

tblTest efTestTbl = context.tblTests.Find(recID);

efTestTbl.Value1 中的值将等于“oldValue”。我看过一些关于 EF 不缓存任何内容的评论,但我不敢相信这是真的。在另一个论坛中,我看到一个讨论 ObjectQuery 的 MergeOption 和缓存被称为“身份解析”。这提供了很多信息,但对我没有帮助,因为我没有使用查询和“ExecuteNonQuery()”方法。

我的场景需要我写出一个更改,然后从数据库中读取并记录更改作为验证步骤。

如果您能帮我找到刷新缓存的方法,我们将不胜感激。

最佳答案

根据上下文中发生的情况,您尝试加载的对象可能已经存在于其他上下文中。

这是我之前为解决此问题所做的;

public static class ZarettoContextExtensionClass
{
public static tblTest Reload(this tblTest item, DbContext c)
{
c.Configuration.AutoDetectChangesEnabled = false;
c.Entry(item).Reload();
c.Configuration.AutoDetectChangesEnabled = true;
return item;
}
}

那么显然你会这样做:

efTestTbl.Reload(context)

关于c# - SaveChanges 获取旧值后 Entity Framework 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536194/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com