/ / Estrutura da entidade, qual é a diferença entre AsNoTracking e MergeOption = NoTracking? - Estrutura de entidade

Entity framework, Qual é a diferença entre AsNoTracking e MergeOption = NoTracking? - Estrutura de entidade

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 № 1

AsNoTracking é 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