UpdateModel MVC действует странно и возвращая значения.Зачем? - PullRequest
0 голосов
/ 10 июня 2011

У меня есть объект, который я пытаюсь обновить, используя MVC (2), также используя EntityFramework Framework.

Я знаю, что не предоставил много кода, но на самом деле не считаю это необходимым. Причину такой логики я объясню:

  • У меня есть несколько каскадных выпадающих списков, и когда один из раскрывающихся списков пуст, я использую jQuery, чтобы заполнить его значением "НЕИЗВЕСТНО", например. с идентификатором как -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 наоборот ( потому что фрукты с идентификатором -1 не существует)! Справедливо, но это не то, что я вам поручил!

Я не понимаю, почему это возвращается, потому что после первого AddToFruits() неизвестное находится в базе данных нормально ... и все до UpdateModel(object); это в object ...

Если он добавит его так, как я его назначил, исключений для FK не будет. Но MVC UpdateModel решает сделать что-то странное и по умолчанию (возможно, то, что пришло с отправкой формы) и облажается.

Почему это происходит? Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

UpdateModel не делает ничего странного, он делает то, что должен;обновите объект значениями из отправки формы.

EF отслеживает изменения, поэтому он пытается обновить значения БД, используя то, что имеет объект во время сохранения.внесение изменений после запуска UpdateModel.

1 голос
/ 10 июня 2011

Вы можете передать массив строк в 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.

...