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
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
jestPerson
,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żejtrue
), 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
iCity
) wewnątrz typu złożonego uległy zmianie lub nie. Lub zmieniła się jakakolwiek właściwość typu złożonego (zmienionoCountry
lubCity
). 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.
Świetne, działa dla mnie z ramą Entity 6! –