Problema ChangeTracker de DBContexter
-
25-10-2019 - |
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 (float
s) y con jerarquías de colección (ObservableCollection
s).
¿Estoy haciendo algo mal?
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.