Я использую 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 не отслеживает изменения свойств индивидуального сложного типа.