EF:分离与急切加载与noTracking

时间:2013-02-06 11:39:21

标签: c# asp.net entity-framework

我对以下含义感到有点困惑:

他们之间有什么区别?

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;
}

1 个答案:

答案 0 :(得分:1)

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

但是改变跟踪不是免费的,它需要相当多的一些空间。因此,当您不需要它时,请使用AsNoTracking作为优化。

  

1)AsNoTracking - 意思是没有肮脏的检查。 (与将EntityState更改为Detached一样?)

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

  

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

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

  

3)是否也需要NoTracking来加载?

不,我不这么认为。