EF 4.1 Code First — определите, какие свойства изменились

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


person Dylan Vester    schedule 18.08.2011    source источник


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

person Slauma    schedule 19.08.2011
comment
отлично, у меня работает и с Entity framework 6! - person J King; 05.10.2013