2012-04-30 14 views
27

Angesichts der folgenden Tracking-Code, wie funktioniert EF/DbContext weiß um die zum Objekt Kunden vorgenommene Änderung:Wie ändern Arbeiten in Entity Framework

class Program 
{ 
    static void Main() 
    { 
     using(var shopContext = new ShopContext()) 
     { 
      var customer = shopContext.Customers.Find(7); 

      customer.City = "Marion"; 

      customer.State = "Indiana"; 

      shopContext.SaveChanges(); 
     } 
    } 
} 

public class ShopContext : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

Danke

+3

Für neue Readern könnte dieser Blog-Beitrag hilfreich sein: http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

Antwort

45

Wenn Sie an das Unternehmen laden aus dem Kontext behält es eine zusätzliche Datenstruktur - nennen wir es Eintrag. Der Eintrag enthält zwei Werte - Originalwerte und aktuelle Werte. Wenn Sie die Operation SaveChanges ausführen, durchläuft EF Ihre Kundenentitäten und aktualisiert die aktuellen Werte im Eintrag so, dass sie mit dem tatsächlichen Status Ihrer Entität übereinstimmen. Dieser Vorgang heißt und erkennt Änderungen. Während der SQL-Befehlsgenerierung vergleicht EF aktuelle und ursprüngliche Werte und erstellt eine SQL-Aktualisierungsanweisung, um geänderte Werte in der Datenbank zu ändern. Dieser Vorgang wird Schnappschuss-Änderungsverfolgung genannt - EF behält einen Schnappschuss im Eintrag bei.

Es gibt eine Alternative namens Dynamische Änderungsverfolgung, die den aktuellen Wert im Eintrag ändert, während Sie den Wert der Eigenschaft Ihrer Entität zuweisen. Die dynamische Änderungsverfolgung hat spezifische Anforderungen (wie alle Ihre Eigenschaften in der Entität muss virtual sein), da sie Ihre Klasse zur Laufzeit in einen dynamischen Proxy umbrechen muss. Dies war früher der bevorzugte Weg, aber aufgrund von Leistungsproblemen in komplexen Szenarios sollte die Verfolgung von Momentaufnahmen derzeit standardmäßig verwendet werden.

+0

hi , wie weiß der Kontext über das Kundenobjekt? Wie ist es verbunden/verbunden? –

+0

Der Kontext weiß es, weil Sie das Kundenobjekt über die gleiche Kontextinstanz durch Aufrufen von 'Customers.Find' abgerufen haben. –

+0

Das ist eine Referenz? –