我对以下内容的含义有点困惑:
它们有什么区别?
1) AsNoTracking
- 意思是没有脏检查。
(与将 EntityState 更改为 Detached
一样吗?)
2) context.Detach(order)
-
(与将 EntityState 更改为 Detached
一样吗?)
3) NoTracking
是否也需要预先加载?
creativeWorkshopEntities.Job.MergeOption = MergeOption.NoTracking;
var q = from c in creativeWorkshopEntities.Job.Include("Files")
where c.Id == jobId
select c;
我只想分离实体
我的 BL 类
中的每个请求都有一个 using
语句。
从数据库中填充缓存后我无法分离实体
因为我仍然在应用程序流程中调用它的属性。我猜它会抛出运行时异常(objectContext is desposed
)
你觉得我的逻辑对吗?
public static Group GetMamData(string stamp, MaMDBEntities maMDBEntities)
{
Group group = MamDataCacheManager.GetMamData(stamp);
if (group == null)
{
//was not found in the cache
//check for aveilable test with status 'start' - 1
group = GetGroupsFromDb(stamp, maMDBEntities);
if (group != null)
{
maMDBEntities.Entry(group).State = EntityState.Detached;
MamDataCacheManager.InsertMamData(stamp, group);
}
}
//option B: attache a new context
if (maMDBEntities.Entry(group).State == EntityState.Detached)
{
maMDBEntities.Groups.Attach(group);
}
return group;
}
最佳答案
ORM (EF) 的主要功能之一是更改跟踪:跟踪更改/删除/新实体,以便生成正确的 SQL。
但是更改跟踪不是免费的,它需要相当多的空间。所以当你不需要它时,使用 AsNoTracking
作为优化。
1) AsNoTracking - meaning no dirtiness check. (same as changing EntityState to Detached?)
最终结果是一样的,但加载它而不跟踪比稍后关闭它更便宜。
2) context.Detach(order) - (same as changing EntityState to Detached?)
基本上,是的。但我认为调用 Detach()
是正确的方法。
3) is NoTracking also needed for eager loading?
不,我不这么认为。
关于c# - EF : detach vs. 预加载与 noTracking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14728148/