2011-01-31 48 views
5

Estoy usando stubs para actualizar mis entidades y cuando la entidad actualizada consiste en columnas que tienen valores cambiados de no nulos a nulos, los nulos no se conservan en la base de datos, es decir, el registro continúa manteniendo los valores previos no nulos .Entity Framework: ¿Actualizar un campo a un valor nulo?

¿Qué estoy haciendo mal?

public void UpdateEntity(Entity e) 
     { 
      _context.Works.Attach(new Entity{ Id = e.Id }); 
      _context.ApplyCurrentValues("Entities", e); 
      _context.SaveChanges(); 
     } 
+0

depende de lo que su relación es, si usted tiene una relación, es necesario asegurarse de que es 0 .. 1 y no 1 a muchos. –

+0

Los valores que intento anular son simples columnas de la base de datos (es decir, date/integer/varchar); aunque hay otras entidades que tienen una relación 1 ... muchos con la entidad, no están siendo modificadas de ninguna manera. –

Respuesta

2

El problema es que se necesita asignar null a estas propiedades después de que Attach(), no antes. ¿Tal vez ApplyCurrentValues() solo copia propiedades que ya no son idénticas? (Nunca lo he probado, pero sería razonable si lo hiciera).

+0

Gracias Craig, creo que este podría ser el problema. No puedo adjuntar la entidad antes de activar ApplyCurrentValues ​​() porque realmente podría estropear mi patrón de repositorio. Para evitar esto, me he visto forzado a recuperar la entidad y manualmente los valores de la entidad separada actualizada actualizan los valores de la entidad adjunta recuperada antes de llamar a SaveChanges(). Soy todo oídos si hay una forma de evitar recuperar la entidad para actualizarla. –

+1

Podría considerar el uso de [ChangeObjectState] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.changeobjectstate.aspx). Eso debería marcar el objeto completo como modificado. –

+0

ChangeObjectState() funcionó perfectamente, gracias Craig. –

0

Intenta evitar cargar entidades usando Adjuntar. Si usted acaba de obtener entidad de la base de datos, usted no tiene que molestarse con banderas configuración de elementos nulled:

var stage = Db.Stages.First(s => s.ID == someId); 
stage.Notation = vm.Notation; // can be also null 
Db.SaveChanges(); 
Cuestiones relacionadas