Код EF 4.1 - сначала определите, какие свойства изменились - PullRequest
16 голосов
/ 19 августа 2011

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

1 Ответ

29 голосов
/ 19 августа 2011

Для скалярных и сложных свойств вы можете использовать следующее для извлечения измененных имен свойств объекта 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 ", " Name " и " Address"но не" Address.Country"или" Address.City"(или" Country"или" City").

  • Если сложное свойство помечено как измененное (.IsModified в приведенном выше коде равно true), то это означает, что либо ссылка (Person.Address в приведенном выше примере) изменилась, независимо от того, действительно ли значения свойств (Country и City) внутри сложного типа изменились или нет. Или что любое из свойств сложного типа изменилось (Country или City изменилось). Я считаю, что невозможно выяснить, какой из них, потому что EF всегда отправляет команду UPDATE для всех свойств сложного типа в базу данных, даже если изменилось только одно свойство, а другое осталось неизменным. Из этого я могу сделать вывод, что EF не отслеживает изменения свойств отдельных сложных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...