实体框架是否有可能找出实体框架将在数据库中进行的实际更改/差异?
考虑一个例子,假设某些行已经存在于数据库中,我们尝试再次添加它们。由于行已存在,因此数据库中的实际更改/差异为空。同样,如果我尝试10行,其中只有3行更新,那么我只想要那3行。
我正在尝试使用DbContext.ChangeTracker
来实现相同的目标,但看起来它会返回我们尝试添加/更新/删除的所有行,而不管它们中是否有一些已存在于数据库中。有人也可以确认这种行为吗?
答案 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);