我一直在探索在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 - 加载原始记录,设置更改的值
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();
优点
- 只需一次数据库查询来更新
缺点
- 无法指定更改的属性
- 视图必须包含每个属性
问题
我的问题是:有没有一种简洁的方法可以实现以下目标?
- 能够指定更改的属性
- 视图不需要包含每个属性(比如密码!)
- 只需一次数据库查询来更新
我知道这可能只是一个小问题,但我可能错过了一个简单的解决方案。如果没有,那么就采用第一种方法吧 ;-)