一尘不染

实体框架5更新记录

c#

我一直在探索在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次查询以加载原始文件,然后对其进行更新

方法2-加载原始记录,设置更改的值

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

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

优点

  • 仅将修改后的属性发送到数据库

缺点

  • 视图需要包含每个属性
  • 在数据库上进行2次查询以加载原始文件,然后对其进行更新

方法3-附加更新的记录并将状态设置为EntityState.Modified

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

优点

  • 1 x查询数据库以更新

缺点

  • 无法指定要更改的属性
  • 视图必须包含每个属性

我对你们的问题;有没有一种干净的方法可以实现这组目标?

  • 可以指定要更改的属性
  • 视图不需要包含每个属性(例如密码!)。
  • 1 x查询数据库以更新

我知道这是一件非常小的事情,但是我可能会缺少一个简单的解决方案。如果不是,则以一种方法为准;-)


阅读 200

收藏
2020-05-19

共1个答案

一尘不染

您正在寻找:

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