问题
我想保存用户编辑时已更改的模型的属性。这就是我想要做的......
但是我遇到第4步的问题。似乎实体框架不想再次访问数据库以获取具有旧值的模型。它只返回我拥有的相同实体。
尝试解决方案
我尝试使用Find()
和SingleOrDefault()
方法,但他们只返回我目前拥有的模型。
示例代码
private string ArchiveChanges(T updatedEntity)
{
//Here is the problem!
//oldEntity is the same as updatedEntity
T oldEntity = DbSet.SingleOrDefault(x => x.ID == updatedEntity.ID);
Dictionary<string, object> changed = new Dictionary<string, object>();
foreach (var propertyInfo in typeof(T).GetProperties())
{
var property = typeof(T).GetProperty(propertyInfo.Name);
//Get the old value and the new value from the models
var newValue = property.GetValue(updatedEntity, null);
var oldValue = property.GetValue(oldEntity, null);
//Check to see if the values are equal
if (!object.Equals(newValue, oldValue))
{
//Values have changed ... log it
changed.Add(propertyInfo.Name, newValue);
}
}
var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
return ser.Serialize(changed);
}
public override void Update(T entityToUpdate)
{
//Do something with this
string json = ArchiveChanges(entityToUpdate);
entityToUpdate.AuditInfo.Updated = DateTime.Now;
entityToUpdate.AuditInfo.UpdatedBy = Thread.CurrentPrincipal.Identity.Name;
base.Update(entityToUpdate);
}
答案 0 :(得分:2)
问题是Entity Framework缓存了它在DbSet中读取的对象。因此,当您第二次请求对象时,它不会进入数据库,因为它已经加载了它。
然而,好消息是Entity会自动跟踪原始值。有关如何获取这些问题的信息,请参阅此问题:How to get original values of an entity in Entity Framework?