C# 自动映射,报告更新的属性
我在数据库中存储来自每日csv文件的订单 每行被解析为一个类对象,每个列有一个属性。 然后使用automapper将该对象转换为实体 某些订单已更新字段,我想报告保存的所有更改 我使用automapper更新数据库对象,并使用C# 自动映射,报告更新的属性,c#,entity-framework-core,automapper,C#,Entity Framework Core,Automapper,我在数据库中存储来自每日csv文件的订单 每行被解析为一个类对象,每个列有一个属性。 然后使用automapper将该对象转换为实体 某些订单已更新字段,我想报告保存的所有更改 我使用automapper更新数据库对象,并使用db.Entry(order).State检测何时进行了更改 逻辑方法似乎使用反射order.GetType().GetProperties()遍历属性,并测试值是否不同:if(!Equals(propertyInfo.GetValue(updateorder),prope
db.Entry(order).State
检测何时进行了更改
逻辑方法似乎使用反射order.GetType().GetProperties()
遍历属性,并测试值是否不同:if(!Equals(propertyInfo.GetValue(updateorder),propertyInfo.GetValue(order))
有没有一种方法可以轻松做到这一点,而不必使用automapper在每个属性上进行第二次循环,或者在这种情况下,我是否应该将automapper去掉 我只使用
DbEntityEntry
在数据访问层中执行此操作。但这并不能避免在所有属性之间循环:
private static IEnumerable<string> GetModifiedProperties(DbEntityEntry dbEntityEntry)
{
foreach (var propertyName in dbEntityEntry.OriginalValues.PropertyNames)
{
var originalValue = dbEntityEntry.OriginalValues[propertyName];
var currentValue = dbEntityEntry.CurrentValues[propertyName];
if (!Equals(originalValue, currentValue))
{
yield return propertyName;
}
}
}
私有静态IEnumerable GetModifiedProperties(DbEntityEntry DbEntityEntry)
{
foreach(dbEntityEntry.OriginalValues.PropertyNames中的var propertyName)
{
var originalValue=dbEntityEntry.originalValue[propertyName];
var currentValue=dbEntityEntry.CurrentValues[propertyName];
如果(!等于(原始值,当前值))
{
收益率返回属性名称;
}
}
}
在调用
base.SaveChanges()
之前,此方法是从DbContext
的重写SaveChanges
方法调用的。这个问题是关于ef核心的,这里要简单得多。您只需使用EntityEntry.Properties
即可查看每个单独属性的状态、原始值和当前值。ok,这将引导我找到所需的解决方案。如果(db.Entry(order.State!=EntityState.Unchanged),我可以通过db.Entry(order.Properties.Where)循环(t=>t.IsModified);并将其放入报告:$“{propertyEntry.Metadata.Name}:{propertyEntry.OriginalValue}=>{propertyEntry.CurrentValue}”