我对以下含义感到有点困惑:
他们之间有什么区别?
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;
我想做的就是分离实体
我的using
中的每个请求都有一个BL class
语句。
在从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;
}
答案 0 :(得分:1)
ORM(EF)的主要功能之一是更改跟踪:跟踪已更改/已删除/新实体,以便生成正确的SQL。
但是改变跟踪不是免费的,它需要相当多的一些空间。因此,当您不需要它时,请使用AsNoTracking
作为优化。
1)AsNoTracking - 意思是没有肮脏的检查。 (与将EntityState更改为Detached一样?)
最终结果是相同的,但加载它而不跟踪比在以后关闭它更便宜。
2)context.Detach(order) - (与将EntityState更改为Detached相同?)
基本上,是的。但我认为调用Detach()
是正确的方法。
3)是否也需要NoTracking来加载?
不,我不这么认为。