代码优先-确定哪些属性被改变了

本文关键字:属性 改变 代码 | 更新日期: 2023-09-27 18:05:57

我使用实体框架4.1代码优先。是否有一种内置的方式来获取自实体从数据库加载以来已更改的属性列表?我知道代码首先检测到对象被更改了,但是有没有一种方法可以准确地获得哪些属性被更改了?

代码优先-确定哪些属性被改变了

对于标量和复杂属性,您可以使用以下命令提取实体myEntity的更改属性名称:

var entry = context.Entry(myEntity);
var namesOfChangedProperties = entry.CurrentValues.PropertyNames
    .Where(p => entry.Property(p).IsModified);

有几点需要注意:

  • CurrentValues.PropertyNames只包含标量和复杂属性,不包含导航属性。

  • Complex properties的意思是:只有在实体上声明的复杂属性的名称,而不是复杂类型本身的实际单个属性,例如:

    [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; }
    }
    

    …那么,如果myEntityPerson, CurrentValues.PropertyNames将包含"Id"、"Name"answers"Address",而不包含"Address"。国家"或"地址。城市"(或"国家"或"城市")。

  • 如果一个复杂的属性被标记为修改(上面代码中的.IsModifiedtrue),那么这意味着引用(上面例子中的Person.Address)已经改变了,不管实际上复杂类型内部的属性值(CountryCity)是否已经改变。或者复杂类型的任何属性发生了变化(CountryCity发生了变化)。我认为不可能找出是哪一个,因为EF总是为所有复杂类型属性向数据库发送UPDATE命令,即使只有一个属性发生了变化而另一个保持不变。我可以由此得出结论,EF不跟踪单个复杂类型属性的变化。