Entity framework 实体框架,AsNoTracking和MergeOption=NoTracking之间的区别是什么?

Entity framework 实体框架,AsNoTracking和MergeOption=NoTracking之间的区别是什么?,entity-framework,Entity Framework,两者之间的区别是什么 myenties.AsNoTracking()和context.myenties.MergeOption=MergeOption.NoTracking? 我从第二次推荐中选择了合并选项,但我还没有真正找到它。我怀疑“MergeOption”的东西从那时起就被微软删除了。AsNoTracking只是MergeOption.NoTracking ObjectContext/ObjectSet版本(ef4及以下)的DbContext/DbSet版本(ef4.1以上) AsNoTr

两者之间的区别是什么
myenties.AsNoTracking()
context.myenties.MergeOption=MergeOption.NoTracking


我从第二次推荐中选择了合并选项,但我还没有真正找到它。我怀疑“MergeOption”的东西从那时起就被微软删除了。

AsNoTracking只是MergeOption.NoTracking ObjectContext/ObjectSet版本(ef4及以下)的DbContext/DbSet版本(ef4.1以上)

AsNoTracking实现:

public static IQueryable AsNoTracking(this IQueryable source)
        {
            Check.NotNull(source, "source");

            var asDbQuery = source as DbQuery;
            return asDbQuery != null ? asDbQuery.AsNoTracking() : CommonAsNoTracking(source);
        }
private static T CommonAsNoTracking<T>(T source) where T : class
        {
            DebugCheck.NotNull(source);

            var asObjectQuery = source as ObjectQuery;
            if (asObjectQuery != null)
            {
                return (T)DbHelpers.CreateNoTrackingQuery(asObjectQuery);
            }

            var noTrackingMethod = source.GetType().GetPublicInstanceMethod("AsNoTracking");
            if (noTrackingMethod != null
                && typeof(T).IsAssignableFrom(noTrackingMethod.ReturnType))
            {
                return (T)noTrackingMethod.Invoke(source, null);
            }

            return source;
        }
public static IQueryable CreateNoTrackingQuery(ObjectQuery query)
        {
            DebugCheck.NotNull(query);

            var asIQueryable = (IQueryable)query;
            var newQuery = (ObjectQuery)asIQueryable.Provider.CreateQuery(asIQueryable.Expression);
            newQuery.ExecutionStrategy = query.ExecutionStrategy;
            newQuery.MergeOption = MergeOption.NoTracking;
            newQuery.Streaming = query.Streaming;
            return newQuery;
        }
CommonAsNoTracking实现:

public static IQueryable AsNoTracking(this IQueryable source)
        {
            Check.NotNull(source, "source");

            var asDbQuery = source as DbQuery;
            return asDbQuery != null ? asDbQuery.AsNoTracking() : CommonAsNoTracking(source);
        }
private static T CommonAsNoTracking<T>(T source) where T : class
        {
            DebugCheck.NotNull(source);

            var asObjectQuery = source as ObjectQuery;
            if (asObjectQuery != null)
            {
                return (T)DbHelpers.CreateNoTrackingQuery(asObjectQuery);
            }

            var noTrackingMethod = source.GetType().GetPublicInstanceMethod("AsNoTracking");
            if (noTrackingMethod != null
                && typeof(T).IsAssignableFrom(noTrackingMethod.ReturnType))
            {
                return (T)noTrackingMethod.Invoke(source, null);
            }

            return source;
        }
public static IQueryable CreateNoTrackingQuery(ObjectQuery query)
        {
            DebugCheck.NotNull(query);

            var asIQueryable = (IQueryable)query;
            var newQuery = (ObjectQuery)asIQueryable.Provider.CreateQuery(asIQueryable.Expression);
            newQuery.ExecutionStrategy = query.ExecutionStrategy;
            newQuery.MergeOption = MergeOption.NoTracking;
            newQuery.Streaming = query.Streaming;
            return newQuery;
        }

取自

AsNoTracking只是MergeOption.NoTracking ObjectContext/ObjectSet版本(EF 4及以下)的DbContext/DbSet版本(EF 4.1及以上)

AsNoTracking实现:

public static IQueryable AsNoTracking(this IQueryable source)
        {
            Check.NotNull(source, "source");

            var asDbQuery = source as DbQuery;
            return asDbQuery != null ? asDbQuery.AsNoTracking() : CommonAsNoTracking(source);
        }
private static T CommonAsNoTracking<T>(T source) where T : class
        {
            DebugCheck.NotNull(source);

            var asObjectQuery = source as ObjectQuery;
            if (asObjectQuery != null)
            {
                return (T)DbHelpers.CreateNoTrackingQuery(asObjectQuery);
            }

            var noTrackingMethod = source.GetType().GetPublicInstanceMethod("AsNoTracking");
            if (noTrackingMethod != null
                && typeof(T).IsAssignableFrom(noTrackingMethod.ReturnType))
            {
                return (T)noTrackingMethod.Invoke(source, null);
            }

            return source;
        }
public static IQueryable CreateNoTrackingQuery(ObjectQuery query)
        {
            DebugCheck.NotNull(query);

            var asIQueryable = (IQueryable)query;
            var newQuery = (ObjectQuery)asIQueryable.Provider.CreateQuery(asIQueryable.Expression);
            newQuery.ExecutionStrategy = query.ExecutionStrategy;
            newQuery.MergeOption = MergeOption.NoTracking;
            newQuery.Streaming = query.Streaming;
            return newQuery;
        }
CommonAsNoTracking实现:

public static IQueryable AsNoTracking(this IQueryable source)
        {
            Check.NotNull(source, "source");

            var asDbQuery = source as DbQuery;
            return asDbQuery != null ? asDbQuery.AsNoTracking() : CommonAsNoTracking(source);
        }
private static T CommonAsNoTracking<T>(T source) where T : class
        {
            DebugCheck.NotNull(source);

            var asObjectQuery = source as ObjectQuery;
            if (asObjectQuery != null)
            {
                return (T)DbHelpers.CreateNoTrackingQuery(asObjectQuery);
            }

            var noTrackingMethod = source.GetType().GetPublicInstanceMethod("AsNoTracking");
            if (noTrackingMethod != null
                && typeof(T).IsAssignableFrom(noTrackingMethod.ReturnType))
            {
                return (T)noTrackingMethod.Invoke(source, null);
            }

            return source;
        }
public static IQueryable CreateNoTrackingQuery(ObjectQuery query)
        {
            DebugCheck.NotNull(query);

            var asIQueryable = (IQueryable)query;
            var newQuery = (ObjectQuery)asIQueryable.Provider.CreateQuery(asIQueryable.Expression);
            newQuery.ExecutionStrategy = query.ExecutionStrategy;
            newQuery.MergeOption = MergeOption.NoTracking;
            newQuery.Streaming = query.Streaming;
            return newQuery;
        }

摘自

您使用的EntityFramework的哪个版本?合并选项用于ObjectSet/ObjectContext。从4.1开始,DbContext位于ObjectContext之上,并且存在AsNoTracking。@thudbutt我使用6.1.3,所以我的猜测是正确的。它们是一样的吗?是的,在封面下,AsNoTracking使用MergeOption.NoTracking。将在我的回答中添加详细信息。您使用的EntityFramework版本是什么?合并选项用于ObjectSet/ObjectContext。从4.1开始,DbContext位于ObjectContext之上,并且存在AsNoTracking。@thudbutt我使用6.1.3,所以我的猜测是正确的。它们是一样的吗?是的,在封面下,AsNoTracking使用MergeOption.NoTracking。我将在我的回答中添加细节。