2013-12-08 31 views
49

Ho letto un sacco di post sul salvataggio di un'entità distaccata in Entity Framework. Tutti sembrano applicarsi alle versioni precedenti di Entity Framework. Fanno riferimento a metodi come ApplyCurrentValues ​​e ChangeObjectState che non sembrano esistere. Per capriccio ho deciso di provare un metodo che ho trovato attraverso intellisense e voglio per assicurarsi che questo è il modo corretto di fare questo dato che non riesco a vedere ciò che accade dietro le quinte:Salva entità distaccata in Entity Framework 6

public void SaveOrder(Order order) 
{ 
    using (VirtualWebEntities db = new VirtualWebEntities()) 
    { 
     db.Orders.Attach(order); 
     db.Entry(order).State = System.Data.Entity.EntityState.Modified; 
     db.SaveChanges(); 
    } 
} 

Is questo è il modo corretto di aggiornare un elemento esistente che è stato modificato?

risposta

80

Sì, questo è corretto. This article describes various ways of adding and attaching entities, e fornisce questo esempio:

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" }; 
using (var context = new BloggingContext()) 
{ 
    // The next step implicitly attaches the entity 
    context.Entry(existingBlog).State = EntityState.Modified; 
    // Do some more work... 
    context.SaveChanges(); 
} 

Dato EF non sa quali proprietà sono diversi da quelli presenti nel database, li aggiorna tutti:

Quando si modifica lo stato di Modified tutte le proprietà dell'entità verranno contrassegnate come modificate e tutti i valori delle proprietà verranno inviati al database quando viene richiamato SaveChanges.

Per evitare questo, è possibile set which properties are modified manualmente piuttosto che impostare l'intero stato di entità:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 
    context.Entry(blog).Property(u => u.Name).IsModified = true;  
    // Use a string for the property name 
    context.Entry(blog).Property("Name").IsModified = true; 
} 
+0

grazie. quindi voglio solo chiarire .. non esiste più un concetto di valori di applycurrent come nelle versioni precedenti in cui è possibile notificare a EF quali campi sono stati modificati? – KingOfHypocrites

+1

@KingOfHypocrites Puoi, ho modificato la mia risposta. Suggerisco di guardare attraverso la [documentazione EF6] (http://msdn.microsoft.com/en-us/data/ee712907), ha molti buoni esempi e spiegazioni ed è scritto in modo molto diretto. –

+0

Grazie per il collegamento. L'unica cosa con il tuo esempio è che dovrei contrassegnare manualmente ciascuna proprietà. La vecchia versione aveva un metodo di valori applicati qui si poteva prendere il nuovo oggetto e applicare a quello vecchio. Questo contrassegna automaticamente qualsiasi proprietà modificata in modo che sappia cosa aggiornare quando salva. Sto ancora cercando un equivalente. – KingOfHypocrites

Problemi correlati