EntityFramework 6:如何查找以前找到的记录

本文关键字:记录 查找 何查找 EntityFramework | 更新日期: 2023-09-27 17:59:02

如果在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

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

EntityFramework 6:如何查找以前找到的记录

需要记住两件事:

  • 如果执行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;
}

尽管通常你不应该这样做。如果您想刷新实体,通常最好处理一个上下文并创建一个新的上下文。

Alrighty。我所需要做的就是:

db3.TabModuleSettings=新的IMS()。选项卡模块设置;

就是这样。