.net 如何将ObjectStateEntry.originalValue转换为实体?

.net 如何将ObjectStateEntry.originalValue转换为实体?,.net,entity-framework,.net,Entity Framework,如何将ObjectStateEntry.originalValue转换为实体? 我想我可以用ObjectContext.Translate方法来实现这一点,但我必须传递DataReader。有什么方法吗?为了将原始值转换为实体对象,您可以对属性使用反射(将名称隐藏在原始值.DataRecordInfo.FieldMetadata[i].FieldType.Name中)。不过,你以后打算做什么?按属性比较实体属性?直接获取修改属性的列表会更容易: var originalValues = your

如何将ObjectStateEntry.originalValue转换为实体?
我想我可以用
ObjectContext.Translate
方法来实现这一点,但我必须传递DataReader。有什么方法吗?

为了将
原始值
转换为
实体
对象,您可以对属性使用反射(将名称隐藏在
原始值.DataRecordInfo.FieldMetadata[i].FieldType.Name中)。不过,你以后打算做什么?按属性比较实体属性?直接获取修改属性的列表会更容易:

var originalValues = yourEntry.OriginalValues;
var currentValues = yourEntry.CurrentValues;
var modifiedProperties = yourEntry.GetModifiedProperties();

foreach (var modifiedProperty in modifiedProperties)
{
    LogChange(string.Format("Property: {0}, Original value: {1}, Current value: {2}", 
                            modifiedProperty,
                            originalValues[modifiedProperty],
                            currentValues[modifiedProperty])
    );
}
或者,您可以为实体对象实现
onSomePropertyChange
方法,并实时记录更改:

public partial class YourEntity
{
    partial void OnSomePropertyChanging(string value)
    {
        LogChange(String.Format("Property: SomeProperty, Original value: {0}, Current value: {1}, Change time: {2}", 
                  this.SomeProperty,
                  value,
                  DateTime.Now.ToShortTimeString())
        );
    }
}

我需要实体的审计历史这就是我需要原始状态的方式很酷的答案,我喜欢你的扩展方法。