Qual é a diferença entre
MyEntities.AsNoTracking()
e context.MyEntities.MergeOption = MergeOption.NoTracking;
?
Eu peguei a opção de mesclar da segunda recomendação Aqui, mas ainda não descobri de verdade. Suspeito que o "MergeOption" foi removido pela Microsoft desde então.
Respostas:
2 para resposta № 1AsNoTracking é simplesmente a versão DbContext / DbSet (EF 4.1 em diante) da versão MergeOption.NoTracking ObjectContext / ObjectSet (EF 4 e abaixo).
Implementação AsNoTracking:
public static IQueryable AsNoTracking(this IQueryable source)
{
Check.NotNull(source, "source");
var asDbQuery = source as DbQuery;
return asDbQuery != null ? asDbQuery.AsNoTracking() : CommonAsNoTracking(source);
}
Implementação CommonAsNoTracking:
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;
}
Implementação de CreateNoTrackingQuery:
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;
}
Tirado de https://entityframework.codeplex.com