Pregunta

Tengo un programa basado en CodeFirst EF-4.1. El usuario obtiene un contexto y puede modificar algunas propiedades. Cuando termina el usuario, hago un rápido

ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);

para determinar si un SaveChanges() se requiere o no. Si hago una llamada 'saveChanges ()', los cambios que han realizado persisten en la base de datos.

Esto funciona para algunas propiedades y no funciona para otras. Específicamente parece funcionar con tipos simples (floats) y con jerarquías de colección (ObservableCollections).

¿Estoy haciendo algo mal?

¿Fue útil?

Solución

Sí, esto es un problema. Algunas relaciones no son rastreadas por DbChangeTracker. Hay diferencia entre Asociación Independiente y Asociación de Clave Exterior. Los cambios en la relación se rastrean en caso de:

  • Relación uno a uno que siempre es una asociación de clave extranjera en EFV4+
  • Relación de uno a muchos con la Asociación de Clave Exterior: debe configurar propiedades de clave extranjera

Los cambios en la relación no se rastrean en caso de:

  • Relación de uno a muchos con la asociación independiente
  • Relación de muchos a muchos que siempre es una asociación independiente

No rastreado para una asociación independiente no es un nombre correcto. Estos cambios se rastrean pero DbChangeTracker no expone el acceso a estos cambios! Debes convertir DbContext a ObjectContext y use ObjectStateManager Para obtener acceso a ObjectStateEntries representando asociaciones independientes.

En este caso, lo más fácil es simplemente llamar SaveChanges siempre. No ejecutará ningún comando de DB si no es necesario guardar datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top