2011-04-08 14 views

Respuesta

105

Si desea desconectar existente objeto sigue el consejo de @ Slauma. Si desea cargar objetos sin realizar un seguimiento de los cambios, utilice:

var data = context.MyEntities.AsNoTracking().Where(...).ToList(); 

Como se ha mencionado en el comentario, esto no eliminará por completo las entidades. Todavía están adjuntos y la carga diferida funciona pero las entidades no son rastreadas. Esto debería usarse, por ejemplo, si desea cargar la entidad solo para leer datos y no tiene la intención de modificarlos.

+2

@Ladislav: Esto es de hecho lo que significaba el codificador de Lol. Nunca he usado y pensado sobre este método aunque a menudo cargue listas de objetos y elimine el contexto de una vez, algo así como 'using (ctx) {return ctx .... ToList(); } ' En tales casos, usar 'AsNoTracking()' tendría mucho sentido porque me ahorraría llenar el contexto del objeto innecesariamente. Supongo que probablemente tenga un rendimiento y un consumo de consumo de memoria especialmente para listas grandes, ¿verdad? – Slauma

+0

@Slauma: Sí, tiene un beneficio de rendimiento. Esa es la razón por la cual este método existe. Usar este enfoque en ObjectContext API es un poco más complicado. –

+0

¿Esto deshabilita la carga diferida? –

161

Esta es una opción:

dbContext.Entry(entity).State = EntityState.Detached; 
+2

¿Puedo hacer esto cuando recupero objetos que devuelven un IQueryable? –

+0

@Lol coder: no estoy seguro si entiendo bien, pero 'entity' debe ser un objeto materializado de un tipo que es parte de las clases de su modelo (Person, Customer, Order, etc.). No puede pasar directamente en un IQueryable a 'dbContext.Entry (...)'. ¿Esa es la pregunta que quisiste decir? – Slauma

+0

¿cuál es la solución? 'AsNoTracking()' o 'Include()' o 'dbContext.Entry (entidad) .State = EntityState.Detached;' –

Cuestiones relacionadas