Как использовать Subsonic update, используя привязку модели mvc? - PullRequest
0 голосов
/ 08 января 2012

Я использую subsonic для доступа к моей БД в приложении MVC. При попытке обновить запись, используя привязку модели mvc, запись не обновляется, поскольку ни один из столбцов не помечен как грязный.

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

Как лучше всего это сделать?

это мое действие:

        [HttpPost]
        public ActionResult Update(mapping m)
        {
           m.SetIsNew(false);
           m.Update(true); // here i tweaked the subsonic code passing true sets all the columns to be dirty and updates the record even though isLoaded=false
           return RedirectToAction("New");
        }

вот как я настроил дозвуковой код:

public void Update(IDataProvider provider, Boolean forceUpdate){
            if(this._dirtyColumns.Count>0 || forceUpdate){
                if(forceUpdate)
                    this._dirtyColumns = this.Columns.ToList();
                _repo.Update(this,provider);
                _dirtyColumns.Clear();    
            }
            OnSaved();
       }

EDIT:

Я опробовал этот код, чтобы увидеть, в чем проблема:

var m = new mapping { ID = 2, Name = "33" };
m.SetIsNew(false);
m.Save();

Это тоже не работает, столбцы не установлены на грязные. Кажется, что когда используется инициализатор объекта, сеттеры не вызываются, поэтому столбцы не устанавливаются как грязные.

Я бы предположил, что привязка модели mvc.net по умолчанию работает таким образом, и поэтому запись не обновляется.

Редактировать 2

Мое первое редактирование неверно, как указано @ dyork12 . Subsonic использует флаг 'isLoaded', когда для него установлено значение false, настройки свойств не устанавливают их как грязные. эта функция используется при загрузке записи с помощью subonic, чтобы удостовериться, что настройки свойств во время загрузки не будут считаться грязными.

Но у меня остается вопрос, как лучше всего обойти дозвуковой объект в представлении mvc.net с использованием автоматической привязки модели.

Ответы [ 2 ]

1 голос
/ 14 января 2012

Я возьму пунт и скажу, что думаю, что ответ таков: _isLoaded - ложь.Не видя намного больше кода, я не могу сказать вам, почему.

Если вы создаете новую запись, _isNew имеет значение true, а _isLoaded - false.При сохранении он делает INSERT и игнорирует грязные столбцы.

Если вы загружаете существующую запись, _IsNew имеет значение false, а _isLoaded имеет значение true.При сохранении он выполняет ОБНОВЛЕНИЕ и обновляет только грязные столбцы.

Ваш фрагмент кода устанавливает _isNew false, но не устанавливает _isLoaded true.Столбцы не помечены грязными, поэтому ничего не экономит.Это легко увидеть, прочитав сгенерированный ActiveRecord код.

[Кстати, вы ошибаетесь в установщиках - они вызываются инициализатором объекта.]

0 голосов
/ 21 января 2012

Итак, первоначальная проблема (как теперь понятно) заключается в том, что MVC каким-то образом загружает строки и создает для них объекты DAL без установки флага isLoaded, и тогда любые вызовы сеттеров не добавляются в список dirtyColumns. Вы должны найти способ установить isLoaded после загрузки записи и создания объекта DAL, прежде чем будут вызваны все сеттеры.

Извините, я недостаточно хорошо знаю MVC, чтобы помочь вам, и вы не включили код для этой части. Я ожидал бы вставить какое-то событие, или наследовать от чего-то, или изменить шаблон, или что-то еще. Как только вы найдете способ установить isLoaded, вы решите проблему. Я надеюсь.

...