¿Cómo separo los objetos en Entity Framework Code First?

Respuestas:

156

Si desea separar el objeto existente, siga los consejos de @ Slauma. Si desea cargar objetos sin realizar un seguimiento de los cambios, use:

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

Como se mencionó en el comentario, esto no separará completamente las entidades. Todavía están unidos y la carga diferida funciona, pero las entidades no se rastrean. Esto debería usarse, por ejemplo, si desea cargar la entidad solo para leer datos y no planea modificarlos.

Ladislav Mrnka
fuente
3
@Ladislav: Esto es probablemente lo que quiso decir Lol Coder. Nunca he usado y pensado en este método, aunque a menudo cargo listas de objetos y elimino el contexto de una vez, algo así using(ctx){ return ctx....ToList(); }. En tales casos, el uso AsNoTracking()tendría mucho sentido porque ahorraría llenar innecesariamente el contexto del objeto. Supongo que probablemente tendría un rendimiento y un beneficio en el consumo de memoria, especialmente para listas grandes, ¿verdad?
Slauma
1
@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.
Ladislav Mrnka
2
¿Esto deshabilita la carga diferida?
Shawn Mclean
3
En realidad, esto no deshabilitará la carga diferida, solo deshabilitará el seguimiento de cambios y mejorará el rendimiento = la entidad aún está conectada. Lo encontré después de responder esta pregunta, por lo que debe marcar la de @ Slauma como una respuesta válida.
Ladislav Mrnka
1
Esto es lo que quiero. Quiero una carga diferida y la capacidad de modificar solo una entidad separada.
Shawn Mclean
255

Esta es una opción:

dbContext.Entry(entity).State = EntityState.Detached;
Slauma
fuente
3
¿Puedo hacer esto al recuperar objetos que devuelven un IQueryable?
Shawn Mclean
1
@Lol codificador: no estoy seguro si te entiendo bien, pero entitydebe ser un objeto materializado de un tipo que sea parte de tus clases de modelo (Persona, Cliente, Pedido, etc.). No puede pasar directamente un IQueryable <T> a dbContext.Entry(...). ¿Esa es la pregunta que quisiste decir?
Slauma
9
@EladBenda: Depende. Si desea separar un objeto que ya está adjunto al contexto, establezca el estado en Detached. Si desea cargar entidades de la base de datos sin asociarlas al contexto (sin seguimiento de cambios), use AsNoTracking.
Slauma
1
Encontré un problema interesante con este método. Aunque la entidad puede ser una clase proxy, la carga diferida no funcionará después de que cambie su estado a Detached.
kjbartel
44
@kjbartel: este es el comportamiento esperado, ya que la entidad no tiene ningún vínculo con el contexto.
Ricardo Souza