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
如何查找以前找到的记录?
需要记住两件事:
-
如果执行
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()。选项卡模块设置;
就是这样。