ASP.NET MVC UpdateModel意外失败

时间:2009-08-26 18:23:14

标签: c# .net asp.net-mvc linq linq-to-sql

我正在尝试通过调用UpdateModel(myObject, new[] { "stringprop1", "stringprop2", "intprop"})更新一些对象属性。

这是因为一个未知的原因而失败的。几个字符串属性正在成功更新。当我尝试更新int属性时,它失败了。新的int值是从视图上的html选择列表发送的。

我可以在ValueProvider中查看视图中的数据。键匹配对象的属性名称,值是我期望从视图中看到的(除了它是一个字符串。我认为UpdateModel可以处理简单的类型转换。

当我调用UpdateModel时,只会抛出InvalidOperationException,只要该属性的值正在变化。

此外,该对象是Linq To Sql生成的对象。

修改

在调用TryUpdateModel之后查看Model State,我在属性上看到了这个例外我遇到了问题:

- Exception {"Operation is not valid due to the current state of the object."} System.Exception {System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException}

我想要更新的值是外键。为什么我不能更新这个值?谢谢你的帮助吗?

编辑2

我发现了这个: http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25

我本可以发誓我之前更改了密钥而不是关联属性,但无论如何。在这个MVC模型绑定情况下可以做些什么?

3 个答案:

答案 0 :(得分:3)

拧紧它。我只是用老式的方式做到了:

myObject.Skunk = db.Skunks.Single(s => s.ID == intprop);

答案 1 :(得分:2)

我有同样的问题然后意识到它是DataContext本身。我在会话中保存了这个,而不是为每个请求创建一个新的。一旦我为每个请求创建了Context,这个错误就消失了。

答案 2 :(得分:0)

我在使用DataLoadOptions时遇到了这个问题。只需使用外键为列设置DLO就足以导致此错误。我通过在没有DLO的情况下创建一个新的DataContext实例来修复它。

请注意,在更新开始时,使用外键的列中的值设置为null没有区别。

我希望这可以帮助有类似问题的人(这个问题是我在尝试自己解决问题时遇到的第一个结果之一)。