asp.net-mvc – 仅使用Entity Framework更新已修改字段的最佳方法
|
目前我这样做: 例如: public update(Person model)
{
// Here model is model return from form on post
var oldobj = db.Person.where(x=>x.ID = model.ID).SingleOrDefault();
db.Entry(oldobj).CurrentValues.SetValues(model);
}
它有效,但是,例如, 我的表中有50列但我在表单中只显示了25个字段(我需要部分更新我的表,其余25列保留相同的旧值) 我知道它可以通过“逐列映射”或通过为剩余的25列创建“隐藏字段”来实现. 只是想知道有没有优雅的方式来做到这一点,省力和最佳性能? 解决方法这个问题问得好.默认情况下,我发现只要启用了更改跟踪(默认情况下,除非您将其关闭),实体框架将很好地仅将您要求更改的内容应用于数据库.因此,如果您只对对象更改1个字段然后调用SaveChanges(),则EF将仅在您调用SaveChanges()时更新该1字段. 这里的问题是,当您将视图模型映射到实体对象时,所有值都会被覆盖.这是我处理这个问题的方法: 在此示例中,您有一个名为Person的实体: Person ====== Id - int FirstName - varchar Surname - varchar Dob - smalldatetime 现在让我们说我们想要创建一个只更新Dob的视图模型,并将所有其他字段保持原样,这就是我这样做的方式. 首先,创建一个视图模型: public class PersonDobVm
{
public int Id { get; set; }
public DateTime Dob { get; set; }
public void MapToModel(Person p)
{
p.Dob = Dob;
}
}
现在大致如下编写代码(您必须更改它以匹配您的上下文名称等): DataContext db = new DataContext();
Person p = db.People.FirstOrDefault();
// you would have this posted in,but we are creating it here just for illustration
var vm = new PersonDobVm
{
Id = p.Id,// the Id you want to update
Dob = new DateTime(2015,1,1) // the new DOB for that row
};
vm.MapToModel(p);
db.SaveChanges();
在将视图模型字段分配给实体对象之前,MapToModel方法可能更复杂并且会执行各种其他检查. 无论如何,调用SaveChanges时的结果是以下SQL: exec sp_executesql N'UPDATE [dbo].[Person] SET [Dob] = @0 WHERE ([Id] = @1) ',N'@0 datetime2(7),@1 int',@0='2015-01-01 00:00:00',@1=1 所以你可以清楚地看到,Entity Framework没有尝试更新任何其他字段 – 只是Dob字段. 我知道在你的例子中你想避免手工编写每个作业,但我认为这是最好的方法.你把它全部收集在你的VM中,这样它就不会乱丢你的主代码,这样你就可以满足特定需求(即那里的复合类型,数据验证等).另一种选择是使用AutoMapper,但我不认为它们是安全的.如果您在VM中使用AutoMapper并将“Dob”拼写为“Doob”,则不会将“Doob”映射到“Dob”,也不会告诉您它!它会无声地失败,用户会认为一切正常,但更改不会被保存. 如果您在VM中将“Dob”拼写为“Doob”,编译器将提醒您MapToModel()正在引用“Dob”,但您的VM中只有一个名为“Doob”的属性. 我希望这可以帮助你. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – DataBinding Eval到2个小数位置不显示0
- 如何在ASP.NET 4.0应用程序的IIS管理器中添加用户?
- asp.net-mvc-2 – 如何在ASP.NET MVC中实现自定义主体和标识
- 在Azure中设置ASP.NET 5 Web应用程序的SQL连接字符串
- asp.net gridview中的datetime格式
- asp.net-mvc – Asp.net MVC查看测试?
- asp.net-mvc – ASP.NET MVC页面不通过3G或某些代理服务器提
- asp.net-mvc – 使用@ Html.Partial渲染usercontrol(cshtml
- ASP.NET缓存 方法和最佳实践
- Asp.Net MVC是企业项目的合适解决方案吗?
- asp.net-web-api – 有没有办法在ASP.Net Web AP
- asp.net – 我可以在ASPX页面中使用扩展方法内联
- asp.net-mvc – 使用AJAX绑定时,在创建/更新后IE
- asp.net-mvc – 具有接受routeValues和htmlAttri
- asp.net-mvc – MVC3验证与实体框架模型/数据库首
- telerik – Kendo DatePicker对自定义日期格式的
- .net – .ToTitleCase不适用于所有大写字符串
- asp.net-mvc-3 – ASP.NET MVC语言更改链接
- asp.net-core-mvc – MVC6路由到单页面应用程序而
- asp.net-mvc – 如何从MVC WEB API Controller返
