2011-08-18 21 views
16

Używam Entity Framework 4.1 Code First. Czy istnieje wbudowany sposób, aby uzyskać listę właściwości, które uległy zmianie od momentu załadowania obiektu z bazy danych? Wiem, że kod pierwszy wykrywa, że ​​obiekt został zmieniony, ale czy istnieje sposób, aby uzyskać dokładnie to, co zmieniło właściwości?EF 4.1 Code First - Określ, jakie właściwości zmieniono

Odpowiedz

28

Dla skalarnych i złożonych właściwościach można użyć następujących wyodrębnić zmienione nazwy właściwości danej jednostki myEntity:

var entry = context.Entry(myEntity); 
var namesOfChangedProperties = entry.CurrentValues.PropertyNames 
    .Where(p => entry.Property(p).IsModified); 

kilka rzeczy, aby pamiętać tutaj:

  • CurrentValues.PropertyNames zawiera tylko skalar i złożone właściwości, a nie właściwości nawigacyjne.

  • właściwości Złożone oznacza: tylko nazwa kompleksu nieruchomości, która jest zadeklarowana na jednostkę, a nie rzeczywiste indywidualne właściwości samego typu złożonego, na przykład: Jeśli masz ten model ...

    [ComplexType] 
    public class Address 
    { 
        public string Country { get; set; } 
        public string City { get; set; } 
    } 
    
    public class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public Address Address { get; set; } 
    } 
    

    ... wtedy, jeśli myEntity jest Person, CurrentValues.PropertyNames będzie zawierać "Id", "Nazwa" i "Adres", ale nie "Address.Country" lub "Adres. "(ani" Kraj "lub" Miasto ").

  • Jeżeli Kompleks ten jest oznaczony jako zmodyfikowany (.IsModified w kod powyżej true), to oznacza to, że albo odniesienia (Person.Address w powyższym przykładzie), zmieniła się, bez względu na to czy w rzeczywistości wartości właściwości (Country i City) wewnątrz typu złożonego uległy zmianie lub nie. Lub zmieniła się jakakolwiek właściwość typu złożonego (zmieniono Country lub City). Wydaje mi się, że nie jest możliwe sprawdzenie, który z nich, ponieważ EF zawsze wysyła do bazy danych polecenie UPDATE dla wszystkich typów właściwości złożonych, nawet jeśli tylko jedna właściwość uległa zmianie, a druga pozostała niezmieniona. Wnioskuję z tego, że EF nie śledzi zmian poszczególnych właściwości typu złożonego.

+2

Świetne, działa dla mnie z ramą Entity 6! –