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

EntityFramework 6: How do I find a previously found record?

如果我在 EntityFramework 6 (ADO) 中找到一条记录,然后尝试再次查找该记录,则 Find 方法 returns 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 认为它不应该再存在并且它不会 return 它。

我不知道你为什么要进行这些 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;
}

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

好的。我需要做的就是:

db3.TabModuleSettings = new IMS().TabModuleSettings;

就是这样。