我正在使用ASP.NET MVC和Entity Framework。我有一个编辑人员网页,其中可以编辑人员的字段,然后在回发操作中,我使用以下代码。
var person = objectCtx.Persons.Where(s => s.Id == id).FirstOrDefault();
TryUpdateModel(person, form.ToValueProvider());
objectCtx.SaveChanges();
效果很好。但是在生成的SQL中,即使值没有更改,我仍然可以看到UPDATE语句。有没有办法在ASP.NET MVC或实体框架中避免这种情况?
答案 0 :(得分:3)
好吧,如果您分配了一个属性,那么实体框架会假设您知道自己在做什么并进行更新。您说用户只更改了一个字段,但我不确定MVC或实体框架应该如何知道,在POSTed HTML表单中的所有keyvalue对中,只有一个实际上已被用户更改。在你的问题中,你说“价值观没有改变”,但在你对@jchapa的答案的评论中,你说“并非所有的信息都是一样的”。这表明实际问题不在于实体框架正在做什么,而在于您告诉它要做什么。
我想也许你正在寻找错误的解决方案。
如果您真正的问题是传递给操作的模型包含用户永远无法更改的字段以及永远不应更新的字段(可能因为它们根本不在表单上),那么您可以将白名单传递给TryUpdateModel
。
如果你的真正问题是另一个用户可能在用户发出表单的GET请求和用户POST她更改的时间之间更改了Person
实例,那么你可以添加一个TIMESTAMP字段到表并在其上设置固定的并发模式。
答案 1 :(得分:0)
如果信息相同,你可能根本没有打电话给SaveChanges()
。