EF:分离 vs. 延迟加载 vs. 不跟踪

3

我对以下内容的含义有些困惑:

它们之间有什么区别?

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已释放)。
你认为我的逻辑正确吗?
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;
}

我无法在......之后分离实体——您能否澄清一下?是编译错误、运行时异常吗? - H H
我将实体添加到缓存后使用它。如果我分离它,那么我猜我会得到一个对象上下文已经被处理的错误。不是吗? - Elad Benda
1个回答

1
一个ORM(EF)的主要功能之一是更改跟踪:跟踪更改/删除/新实体,以便生成适当的SQL。

但更改跟踪并不是免费的,它需要相当多的时间和空间。因此,当您不需要它时,请使用 AsNoTracking 进行优化。

1)AsNoTracking-意思是没有脏数据检查。(与将EntityState更改为Detached相同?)

最终结果是相同的,但是无跟踪加载它比以后关闭更便宜。

2)context.Detach(order)-(与将EntityState更改为Detached相同?)

基本上是的。但我认为调用 Detach() 是正确的方式。

3)对于急切加载,禁用跟踪是否也需要?

不需要,我认为不需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接