2013-12-08 20 views
49

Ich habe viele Posts zum Speichern einer getrennten Entität in Entity Framework gelesen. Alle scheinen auf ältere Versionen von Entity Framework zutreffen. Sie verweisen auf Methoden wie ApplyCurrentValues ​​und ChangeObjectState, die nicht zu existieren scheinen. Aus einer Laune heraus habe ich beschlossen, eine Methode zu versuchen, ich durch Intellisense gefunden und ich möchte sicherstellen, dass dies der richtige Weg ist, dies zu tun, da ich zu nicht sehen, was hinter den Kulissen passiert:Gespeicherte Entität in Entity Framework 6 speichern

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(); 
    } 
} 

Ist das die korrekte Weise, ein vorhandenes Einzelteil zu aktualisieren, das geändert wurde?

Antwort

80

Ja, das ist richtig. This article describes various ways of adding and attaching entities, und es bietet dieses Beispiel:

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(); 
} 

Da EF nicht weiß, welche Eigenschaften sich von denen in der Datenbank unterschiedlich sind, wird es aktualisiert sie alle:

Wenn Sie den Zustand zu ändern Modifiziert Alle Eigenschaften der Entität werden als geändert markiert und alle Eigenschaftswerte werden an die Datenbank gesendet, wenn SaveChanges aufgerufen wird.

Um dies zu vermeiden, können Sie set which properties are modified manuell anstatt die gesamte Entitätsstatus Einstellung:

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

Dank. also ich möchte nur klarstellen .. es gibt nicht mehr ein Konzept von applycurrentvalues ​​wie in früheren Versionen, wo Sie EF mitteilen könnten, welche Felder geändert wurden? – KingOfHypocrites

+1

@KingOfHypocrites Sie können, ich habe meine Antwort bearbeitet. Ich schlage vor, die [EF6-Dokumentation] (http://msdn.microsoft.com/en-us/data/ee712907) durchzusehen, sie hat viele gute Beispiele und Erklärungen und ist sehr einfach geschrieben. –

+0

Danke für den Link. Das einzige an Ihrem Beispiel ist, dass ich jede Eigenschaft manuell markieren müsste. Die alte Version hatte eine Methode zum Anwenden von Werten. Sie könnten das neue Objekt übernehmen und auf das alte anwenden. Dies würde automatisch alle geänderten Eigenschaften markieren, so dass es weiß, was beim Speichern aktualisiert werden muss. Ich suche immer noch nach einem Äquivalent. – KingOfHypocrites

Verwandte Themen