Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射,报告更新的属性_C#_Entity Framework Core_Automapper - Fatal编程技术网

C# 自动映射,报告更新的属性

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

我在数据库中存储来自每日csv文件的订单

每行被解析为一个类对象,每个列有一个属性。 然后使用automapper将该对象转换为实体

某些订单已更新字段,我想报告保存的所有更改

我使用automapper更新数据库对象,并使用
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}”