C# MVC&x27;s UpdateModel的行为异常并正在恢复值。为什么?

C# MVC&x27;s UpdateModel的行为异常并正在恢复值。为什么?,c#,asp.net-mvc,entity-framework,updatemodel,C#,Asp.net Mvc,Entity Framework,Updatemodel,我有一个对象,我正在尝试使用MVC(2)更新,也使用EntityFramework 我知道我没有提供太多的代码,但我真的觉得没有必要。我之所以有这样的逻辑,我会解释: 我有一些级联下拉列表,当其中一个下拉列表为空时,我使用jQuery将其填充为“未知”值,例如id为-1 所以当我得到值-1时,我创建另一个表中的未知值 然后我找到该对象并将其分配给Fruit 代码如下: if (id == -1) { //The object was u

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

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

  • 我有一些级联下拉列表,当其中一个下拉列表为空时,我使用jQuery将其填充为“未知”值,例如id为-1
  • 所以当我得到值-1时,我创建另一个表中的未知值
  • 然后我找到该对象并将其分配给
    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(对象)之后行运行时,我在中设置的值,例如,
Fruit
将恢复为从表单发送过来的值。。。(即-1)然后
EntityFramework.SaveChanges()FK对抗失败(因为id为-1的水果不存在)!很公平——但这不是我分配给你的

我不明白它为什么会恢复,因为在第一次
AddToFruits()
之后,未知的内容就在数据库中了。。。直到
UpdateModel(对象)它位于
对象中

如果它像我指定的那样添加它,则不会出现FK约束异常。但是MVC的UpdateModel决定做一些奇怪的事情,默认为(可能是表单提交带来的结果)并把它搞砸了


为什么会发生这种情况?如何修复它?

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

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


运行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和日期。

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

这是有效的,因为我真的不明白为什么必须手动指定要更新的字段?默认的
UpdateModel(object)
我会假设尝试更新所有已更改的?没有人明确回答,但它似乎覆盖了代码中设置的内容,并从形式上取而代之。这个问题的另一个答案是,我应该在调用
UpdateModel
之后这样做。这似乎是一种奇怪的做法,而且在该调用中会抛出异常,因此为该调用编写excpetion处理,然后在之后手动更新它似乎很奇怪-多么奇怪!当您不指定时,它会更新所有字段,而不仅仅是已更改的字段。这包括在调用UpdateModel之前对其设置的属性。因此,为了避免这种情况,您确切地告诉MVC您希望更新哪些属性,以避免它覆盖您希望它保留的属性。这是有效的,因为我不太明白为什么我必须手动指定要更新的字段?默认的
UpdateModel(object)
我会假设尝试更新所有已更改的?没有人明确回答,但它似乎覆盖了代码中设置的内容,并从形式上取而代之。这个问题的另一个答案是,我应该在调用
UpdateModel
之后这样做。这似乎是一种奇怪的做法,而且在该调用中会抛出异常,因此为该调用编写excpetion处理,然后在之后手动更新它似乎很奇怪-多么奇怪!当您不指定时,它会更新所有字段,而不仅仅是已更改的字段。这包括在调用UpdateModel之前对其设置的属性。因此,为了避免这种情况,您需要准确地告诉MVC您希望更新哪些属性,以避免它覆盖您希望它保留的属性。实际上,您的意思是“在运行
UpdateModel
”之后和调用
EntityFramework.SaveChanges()
之前进行更改来解决这个问题。是的,这就是我的意思。您也可以使用下面提到的白名单方法,但在这种情况下,您仍然需要手动将内容绑定在一起。实际上,您的意思是“在运行
UpdateModel
”之后和调用
EntityFramework.SaveChanges()
之前进行更改来解决问题。是的,这就是我的意思。您也可以使用下面提到的白名单方法,但在这种情况下,您仍然需要手动将内容绑定在一起。