MVC';s UpdateModel的行为奇怪并且正在恢复值.为什么?

本文关键字:恢复 为什么 UpdateModel MVC | 更新日期: 2023-09-27 17:58:46

我有一个对象,我正在尝试使用MVC(2)更新,也使用EntityFramework框架。

我知道我没有提供太多的代码,但我真的觉得没有必要。我之所以有这样的逻辑,我来解释一下:

  • 我有一些级联的下拉列表,当其中一个下拉列表为空时,我使用jQuery用一个"UNKNOWN"值填充它,例如id为-1
  • 因此,当我得到值-1时,我会创建另一个表中的UNKNOWN值
  • 然后我找到那个对象并将其分配给Fruit

代码如下:

if (id == -1)
            {
                //The object was unknown so create it
                var newUnknown = new Fruit
                                 {
Name = "UNKNOWN";
};
EntityFramework.AddToFruits(newUnknown);
EntityFramework.SaveChanges();
defaultValueObject = EntityFramework.Fruits.Single(x=>x.FruitID == newUnknown.FruitID);
object.Fruit = defaultValueObject;
object.Date = DateTime.Now;
UpdateModel(object);
EntityFramework.SaveChanges();

运行UpdateModel(object);行后,我在中设置的值,例如,Fruit将恢复为从表单…发送的值(即-1),然后EntityFramework.SaveChanges();将使FK contrinst失败(因为id为-1的水果不存在)!很公平,但这不是我分配给你的!

我不明白为什么它会恢复,因为在第一个AddToFruits()之后,未知的就在数据库中了。。。直到CCD_ 6,它都在CCD_。。。

如果它像我指定的那样添加它,就不会有FK约束异常。但是MVC的UpdateModel决定做一些奇怪的事情并默认(也许是表单提交带来的),然后把它搞砸了。

为什么会发生这种情况?我该怎么修?

MVC';s UpdateModel的行为奇怪并且正在恢复值.为什么?

UpdateModel并没有做任何奇怪的事情,它正在做它应该做的事情;使用表单提交中的值更新对象。

EF正在跟踪更改,因此它尝试使用对象在保存时的值更新db值。

通过在运行UpdateModel后进行更改来解决此问题。

您可以将字符串数组传递给UpdateModel,告诉它要在模型中更新哪些属性。

public class Fruit
{
    int ID { get; set; }
    bool IsTasty { get; set; }
    string MyOtherPropert { get; set; }
    DateTime Date { get; set; }
}
...
if (id == -1)
{
    //The object was unknown so create it
    var newUnknown = new Fruit
    {
        Name = "UNKNOWN"
    };
    EntityFramework.AddToFruits (newUnknown);
    EntityFramework.SaveChanges ();
    defaultValueObject = EntityFramework.Fruits.Single (x=>x.FruitID == newUnknown.FruitID);
    defaultValueObject.Date = DateTime.Now;
    UpdateModel (object, new string[] { "IsTasty", "MyOtherProperty" });
    EntityFramework.SaveChanges ();
}

这样做可以确保你想要更新的所有属性都会被更新,并且那些你想要独处的属性不会被触碰。在这种情况下,UpdateModel将忽略ID和Date。