Я использую 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", " Имя" и " Адрес", но не Адрес. Страна "или" Адрес. Город "(а также" Страна "или" Город "). -
Если сложное свойство помечено как измененное (
.IsModified
в приведенном выше кодеtrue
), это означает, что либо ссылка (Person.Address
в приведенном выше примере) изменилась, независимо от того, действительно ли значения свойств (Country
иCity
) внутри сложного типа изменились или нет. Или что изменилось какое-либо из свойств сложного типа (Country
илиCity
). Я считаю, что невозможно узнать, какой из них, потому что EF всегда отправляет команду UPDATE для всех свойств сложного типа в базу данных, даже если изменилось только одно свойство, а другое не изменилось. Я бы сделал вывод из этого, что EF не отслеживает изменения свойств индивидуального сложного типа.