实体框架5更新记录

在ASP.NET MVC3环境中,我一直在探索在Entity Framework 5中编辑/更新记录的不同方法,但到目前为止,他们都没有打勾我需要的所有框。 我会解释为什么。

我已经找到了三种方法,我会提及利弊:

方法1 - 加载原始记录,更新每个属性

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    original.EmployeeId = updatedUser.EmployeeId;
    original.Forename = updatedUser.Forename;
    original.Surname = updatedUser.Surname;
    original.Telephone = updatedUser.Telephone;
    original.Title = updatedUser.Title;
    original.Fax = updatedUser.Fax;
    original.ASPNetUserId = updatedUser.ASPNetUserId;
    db.SaveChanges();
}    

优点

  • 可以指定哪些属性更改
  • 视图不需要包含每个属性
  • 缺点

  • 2 x查询数据库以加载原始数据然后进行更新
  • 方法2 - 加载原始记录,设置更改的值

    var original = db.Users.Find(updatedUser.UserId);
    
    if (original != null)
    {
        db.Entry(original).CurrentValues.SetValues(updatedUser);
        db.SaveChanges();
    }
    

    优点

  • 只有修改过的属性才会发送到数据库
  • 缺点

  • 视图需要包含每个属性
  • 2 x查询数据库以加载原始数据然后进行更新
  • 方法3 - 附加更新的记录并将状态设置为EntityState.Modified

    db.Users.Attach(updatedUser);
    db.Entry(updatedUser).State = EntityState.Modified;
    db.SaveChanges();
    

    优点

  • 1 x查询数据库进行更新
  • 缺点

  • 无法指定哪些属性更改
  • 视图必须包含每个属性
  • 我对你们的问题; 有没有一种干净的方式可以实现这一套目标?

  • 可以指定哪些属性更改
  • 视图不需要包含每个属性(如密码!)
  • 1 x查询数据库进行更新
  • 我知道这是一个很小的事情要指出,但我可能会错过一个简单的解决方案。 如果不是方法一将占上风;-)


    您正在寻找:

    db.Users.Attach(updatedUser);
    var entry = db.Entry(updatedUser);
    entry.Property(e => e.Email).IsModified = true;
    // other changed properties
    db.SaveChanges();
    

    我非常喜欢接受的答案。 我相信还有另一种方法来处理这个问题。 假设您有一个非常短的属性列表,您不希望将其添加到视图中,因此更新实体时,这些属性将被忽略。 假设这两个字段是密码和SSN。

    db.Users.Attach(updatedUser);
    
    var entry = db.Entry(updatedUser);
    entry.State = EntityState.Modified;
    
    entry.Property(e => e.Password).IsModified = false;
    entry.Property(e => e.SSN).IsModified = false;   
    
    db.SaveChanges();   
    

    这个例子允许你在向用户表和你的视图添加一个新字段后,基本上保持你的业务逻辑不变。


    foreach(PropertyInfo propertyInfo in original.GetType().GetProperties()) {
        if (propertyInfo.GetValue(updatedUser, null) == null)
            propertyInfo.SetValue(updatedUser, propertyInfo.GetValue(original, null), null);
    }
    db.Entry(original).CurrentValues.SetValues(updatedUser);
    db.SaveChanges();
    
    链接地址: http://www.djcxy.com/p/5737.html

    上一篇: Entity Framework 5 Updating a Record

    下一篇: Saving changes with Entity Framework causes detached entity duplicate