我的实体有以下更新通用方法:
public void Update < T > (T entity) where T: class {
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == System.Data.Entity.EntityState.Detached) {
DbContext.Set < T > ().Attach(entity);
}
dbEntityEntry.State = System.Data.Entity.EntityState.Modified;
}
在SaveChanges()
数据在数据库中成功更新后。
现在我需要在SaveChanges()
之前实施和审核日志,但我注意到CurrentValues
等于OriginalValues
:
// For updates, we only want to capture the columns that actually changed
if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName))){
//here I add a new Audit Log entity
}
有关如何解决此问题的任何线索?或者在Entity Framework 6中有更好的方法吗?
答案 0 :(得分:1)
从实体本身恢复原始值。如果正在通过上下文跟踪实体,则可以使用此信息。
在您的情况下,您使用的是已删除的实体,因此没有更改跟踪,并且实体没有原始值。
所以,在这种情况下,如果您需要原始值,除了从数据库中获取它们之外别无选择,并逐一进行比较。
如果您想获得一个行为就好像它已被上下文跟踪的实体,您可以使用上下文从数据库中读取实体,并使用ValueInjecter之类的内容自动设置属性值被取消的实体进入被跟踪的实体。
答案 1 :(得分:0)
如果使用断开连接的实体,则可以设置原始值而不影响实体实例值,请根据需要调整此方法
public static void LoadOriginalValues(this WorkflowsContext db, DbEntityEntry entity)
{
var props = entity.GetDatabaseValues();
foreach (var p in props.PropertyNames)
{
if (entity.Property(p).IsModified)
{
entity.Property(p).OriginalValue = props[p];
}
}
}