Подтвердить что ты не робот

EF 4.1 Code First - определение свойств

Я использую Entity Framework 4.1 Code First. Есть ли встроенный способ получить список свойств, которые были изменены после того, как объект был загружен из базы данных? Я знаю, что код сначала обнаруживает, что объект был изменен, но есть ли способ получить именно то, какие свойства изменились?

4b9b3361

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