2012-04-30 11 views
27

Biorąc pod uwagę następujący kod, w jaki sposób EF/DbContext wie o zmianach dokonanych w klienta obiektu:Jak zmienić utwory śledzenia w 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; } 
} 

dziękuję

+3

Dla nowych reaaderów ten wpis na blogu może być pomocny: http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

Odpowiedz

45

Podczas ładowania podmiotu z kontekstu utrzymuje dodatkową strukturę danych - nazwijmy to wejściem. Pozycja zawiera dwa zestawy wartości - oryginalne wartości i bieżące wartości. Po wykonaniu operacji EF przechodzi przez jednostki klienta i aktualizuje bieżące wartości we wpisie, tak aby pasowały do ​​rzeczywistego stanu obiektu - ta operacja nazywa się wykrywaniem zmian. Podczas generowania poleceń SQL EF porównuje bieżące i oryginalne wartości i tworzy instrukcję aktualizacji SQL, aby zmodyfikować zmienione wartości w bazie danych. Ta operacja nazywa się śledzenie zmiany migawki - EF przechowuje migawkę w zapisie.

Istnieje alternatywa o nazwie dynamicznego śledzenia zmian, która zmodyfikuje bieżącą wartość we wpisie w tym samym czasie, gdy przypiszesz wartość do właściwości obiektu. Dynamiczne śledzenie zmian ma określone wymagania (np. Wszystkie twoje właściwości w jednostce muszą być virtual), ponieważ muszą zawijać twoją klasę do dynamicznego proxy w czasie wykonywania. Zwykle był to preferowany sposób, ale ze względu na problemy z wydajnością w złożonych scenariuszach, śledzenie zmian migawek ma obecnie być domyślnie stosowane.

+0

cześć , jak kontekst wie o obiekcie klienta? Jak jest połączony/połączony? –

+0

Kontekst wie o tym, ponieważ pobrano obiekt klienta przez to samo wystąpienie kontekstu, wywołując 'Customers.Find' –

+0

, to jest odwołanie? –