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;
就是这样。
如果我在 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;
就是这样。