gpt4 book ai didi

c# - Entity Framework 6 : How do I find a previously found record?

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:34 24 4
gpt4 key购买 nike

如果我在 EntityFramework 6 (ADO) 中找到一条记录,然后尝试再次查找该记录,则 Find 方法返回 0。这是一个示例:

var db3 = new IMS();

db3.TabModuleSettings.Find(973, "ShowSoldOut"); //Local.Count=1
db3.TabModuleSettings.Local.Clear(); //Local.Count=0

db3.TabModuleSettings.Find( 142, "AllowIndex" ); //Local.Count=1
db3.TabModuleSettings.Local.Clear(); //Local.Count=0

db3.TabModuleSettings.Find(973, "ShowSoldOut"); //Local.Count=0
db3.TabModuleSettings.Local.Clear(); //Local.Count=0

db3.TabModuleSettings.Find( 142, "AllowIndex" ); //Local.Count=0

如何找到以前找到的记录?

最佳答案

要记住两点:

  • 如果您执行 Local.Clear()Local 集合中的实体将被标记为删除。因此具有键值 (973, "ShowSoldOut") 的实体仍然存在于上下文的缓存中,但它的状态是 Deleted。 (与后面的 (142, "AllowIndex") 相同)。

  • DbSet.Find 首先在上下文缓存中查找实体,如果找不到,则在数据库中查找。如果实体在缓存中找到,但已被删除,EF 认为它不应该再存在并且不会返回它。

我不知道你为什么要调用这些 Local.Clear(),但我希望你现在意识到要小心使用它。

清除缓存的正确方法是分离实体,例如对于一个 Local 集合:

foreach (var x in db3.TabModuleSettings.Local.ToList())
{
Entry(x).State = System.Data.Entity.EntityState.Detached;
}

(尽管这不会分离已删除的实体)。

或者整个缓存:

foreach (var entry in db3.ChangeTracker.Entries())
{
entry.State = System.Data.Entity.EntityState.Detached;
}

(还将分离已删除的实体)。

或特定类型的所有实体(包括已删除的实体):

foreach (var entry in db3.ChangeTracker.Entries<TabModuleSetting>())
{
entry.State = System.Data.Entity.EntityState.Detached;
}

虽然通常情况下您不必这样做。如果您想刷新实体,通常最好处理一个上下文并创建一个新上下文。

关于c# - Entity Framework 6 : How do I find a previously found record?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38622239/

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