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。我将在我的回答中添加细节。