Я использую Entity Framework 4.1 Code First. Есть ли встроенный способ получить список свойств, которые изменились с момента загрузки объекта из базы данных? Я знаю, что код сначала обнаруживает, что объект был изменен, но есть ли способ узнать, какие именно свойства изменились?
EF 4.1 Code First — определите, какие свойства изменились
Ответы (1)
Для скалярных и сложных свойств вы можете использовать следующее, чтобы извлечь измененные имена свойств объекта myEntity
:
var entry = context.Entry(myEntity);
var namesOfChangedProperties = entry.CurrentValues.PropertyNames
.Where(p => entry.Property(p).IsModified);
Несколько замечаний:
CurrentValues.PropertyNames
содержит только скалярные и комплексные свойства, но не свойства навигации.Сложные свойства означают: Только имя сложного свойства, которое объявлено для объекта, а не фактические отдельные свойства самого сложного типа, например: Если у вас есть эта модель...
[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; } }
... тогда, если
myEntity
являетсяPerson
,CurrentValues.PropertyNames
будет содержать "Id", "Имя" и "Адрес", но не "< strong>Адрес.Страна" или "Адрес.Город" (а также "Страна" или "Город").Если сложное свойство помечено как измененное (
.IsModified
в приведенном выше коде равноtrue
), то это означает, что либо ссылка (Person.Address
в приведенном выше примере) изменилась, независимо от того, действительно ли значения свойства (Country
иCity
) внутри сложного Тип изменился или нет. Или что изменилось какое-либо из свойств сложного типа (изменилосьCountry
илиCity
). Я думаю, что невозможно узнать, какой именно, потому что EF всегда отправляет команду UPDATE для всех свойств сложного типа в базу данных, даже если только одно свойство изменилось, а другое осталось неизменным. Из этого я бы сделал вывод, что EF не отслеживает изменения свойств отдельных сложных типов.