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