2011-01-31 13 views
5

Sto utilizzando stub per aggiornare le mie entità e quando l'entità aggiornata è costituita da colonne che hanno valori modificati da non null a null, i valori null non vengono mantenuti nel database, ovvero il record continua a contenere i valori non null precedenti .Entity Framework: aggiornamento di un campo a un valore nullo?

Cosa sto sbagliando?

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

dipende da ciò che il vostro rapporto è, se si dispone di un rapporto, è necessario assicurarsi che sia 0 .. 1 e non 1 a molti. –

+0

I valori che sto tentando di annullare sono semplici colonne del database (cioè data/intero/varchar); sebbene ci siano altre entità che hanno una ... molte relazioni con l'entità, non vengono in alcun modo modificate. –

risposta

2

Il problema è che è necessario assegnare null a queste proprietà dopo si Attach(), non prima. Forse ApplyCurrentValues() copia solo proprietà non già identiche? (Non ho mai provato, ma sarebbe ragionevole se lo facesse.)

+0

Grazie Craig, penso che questo potrebbe davvero essere il problema. Non riesco a collegare l'entità prima di attivare ApplyCurrentValues ​​() perché farebbe davvero un errore nel mio pattern di repository. Per ovviare a ciò, sono stato costretto a recuperare l'entità e manualmente i valori dell'entità indipendente aggiornata aggiornano i valori dell'entità collegata recuperata prima di chiamare SaveChanges(). Sono tutto orecchie se c'è un modo per evitare di recuperare l'entità per aggiornarlo. –

+1

Si potrebbe considerare l'utilizzo di [ChangeObjectState] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.changeobjectstate.aspx). Questo dovrebbe contrassegnare l'intero oggetto come modificato. –

+0

ChangeObjectState() ha funzionato perfettamente, grazie Craig. –

0

Cerca di evitare di caricare entità usando Allega. Se hai appena ottiene un'entità da DB, non c'è bisogno di perdere tempo con le impostazioni di bandiere sugli articoli annullato:

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