MVC的UpdateModel表现奇怪并且还原值。为什么?

时间:2011-06-10 05:38:37

标签: c# asp.net-mvc entity-framework updatemodel

我有一个对象,我正在尝试使用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)然后{{1 FK反对失败(因为id为-1的水果不存在)!很公平 - 但那不是我给你的!

我不明白为什么它会恢复,因为在第一个EntityFramework.SaveChanges();未知数据库中的数据库正常......并且所有直到AddToFruits()它都在UpdateModel(object);中。

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

为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以将一个字符串数组传递给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。