我一直在探索在 ASP.NET MVC5环境中编辑/更新实体框架3中的记录的不同方法,但到目前为止,它们都没有满足我需要的所有框。我会解释为什么。
我找到了三种方法,我将提到它们的优缺点:
方法 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();
}
优点
缺点
方法 3 – 附加更新的记录并将状态设置为实体状态。
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
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();
此示例允许您在向 Users 表和视图添加新字段后基本上不考虑业务逻辑。
网友回答:
您正在寻找:
db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
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();
模板简介:该模板名称为【ASP.NET MVC5环境中编辑/更新实体框架3中的记录的不同方法】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。