找出数据库中的实际更改/差异

时间:2013-09-14 13:02:03

标签: c# entity-framework

实体框架是否有可能找出实体框架将在数据库中进行的实际更改/差异?

考虑一个例子,假设某些行已经存在于数据库中,我们尝试再次添加它们。由于行已存在,因此数据库中的实际更改/差异为空。同样,如果我尝试10行,其中只有3行更新,那么我只想要那3行。

我正在尝试使用DbContext.ChangeTracker来实现相同的目标,但看起来它会返回我们尝试添加/更新/删除的所有行,而不管它们中是否有一些已存在于数据库中。有人也可以确认这种行为吗?

1 个答案:

答案 0 :(得分:0)

我在我的基础存储库中使用以下代码来获取已修改属性名称和旧DB值的字典。 TModel对象本身可以轻松获取新值。

private Dictionary<string, object> GetModifiedProperties(TModel model)
{
var entry = Context.Entry(model);

// entry is detached.
// set entry to database entry and its CurrentValues to model values
if (entry.State == EntityState.Detached)
{
    object key = model.GetType().GetProperty("Id").GetValue(model);
    if (key == null)
    {
        throw new InvalidOperationException("The Entity you desire to update does not contain an Id value.");
    }

    var dbModel = Context.Set<TModel>().Find(key);
    var dbEntry = Context.Entry(dbModel);
    dbEntry.CurrentValues.SetValues(model);

    entry = dbEntry;
    //entry.State = EntityState.Modified;
}

var modifiedProps = new Dictionary<string, object>();
foreach (var propertyName in entry.CurrentValues.PropertyNames)
{
    // copy only changed values to dict
    var prop = entry.Property(propertyName);
    if (prop.IsModified)
    {
        modifiedProps.Add(propertyName, prop.OriginalValue);
    }
}
return modifiedProps;
}

可悲的是,我找不到获得Key属性的优雅方法。但“Id”对我有用。只有更改的属性才会出现在字典中。不完全是你想要的,但可以使用。

编辑:我使用工作单元模式为我的DAL。每个存储库都来自我的基本存储库,此代码来自此基础存储库。 update方法触发GetModifiedProperties()方法。 你可以写一个像这样的更新方法:

UnitOfWork.CutomerRepository.Update(Customer updated, out Dictionary<string, object> changedProps);