两个对同一域/实体模型的引用

时间:2012-07-06 20:01:51

标签: c# .net sql-server asp.net-mvc entity-framework

问题

我想保存用户编辑时已更改的模型的属性。这就是我想要做的......

  1. 检索已编辑的视图模型
  2. 获取域模型并重新映射更新后的值
  3. 调用存储库
  4. 上的更新方法
  5. 获取“旧”域模型并比较字段值
  6. 将更改后的值(以JSON格式)存储到表格中
  7. 但是我遇到第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);
    }
    

1 个答案:

答案 0 :(得分:2)

问题是Entity Framework缓存了它在DbSet中读取的对象。因此,当您第二次请求对象时,它不会进入数据库,因为它已经加载了它。

然而,好消息是Entity会自动跟踪原始值。有关如何获取这些问题的信息,请参阅此问题:How to get original values of an entity in Entity Framework?