我对以下内容的含义有点困惑:
它们之间有什么区别?
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 class
中的每个请求都有一个using
语句。
在从DB 填充缓存后,我无法分离实体
因为我仍然在应用程序流中调用它的属性。我猜它会抛出运行时异常(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-意味着没有污垢检查。(与将EntityState更改为Detached相同?)
最终结果是一样的,但在没有跟踪的情况下加载它比稍后关闭它更便宜。
2) 上下文。分离(订单)-(与将EntityState更改为Detached相同?)
基本上,是的。但我认为呼叫Detach()
是正确的方式。
3) 是否也需要NoTracking来进行热切加载?
不,我不这么认为。