2012-01-08 5 views
0

Я использую дозвуковой доступ к моей БД в приложении mvc. При попытке обновить запись с использованием привязки модели 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 по умолчанию работает таким образом, и поэтому запись не обновляется.

Edit 2

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

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

+0

На ваш взгляд, вы связываете объект SubSonic сгенерированный объект или используете ViewModel? Вы видели это? http://stackoverflow.com/questions/5491733/subsonic-and-automapper-dirtycolumns-collection-is-empty-therefore-cant-updat – DaveHogan

+0

Почему они не помечены грязными? Этот фрагмент кода от ActiveRecord, и если вы привязываетесь к свойствам столбца, все должно работать правильно. Что вы делаете по-другому? Больше кода пожалуйста. –

+0

@ dyork12: я ответил в «edit». – Daniel

ответ

0

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

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

+0

Спасибо, я полагаю, это путь. но, на мой взгляд, способ, которым работает флаг isLoaded, неинтуитивный, его там не должно быть. если есть проблема, когда дозвуковые нагрузки записывают запись из БД, он должен установить флаг загрузки, а затем отключить его, когда это будет сделано, это не должно быть видно пользователям дозвуковых. – Daniel

+0

Это обычный шаблон, который имеет загруженный флаг и грязный флаг. Загруженный флаг говорит, что строка была извлечена из базы данных; грязный флаг говорит, что он был изменен; вместе они охватывают все комбинации. Если вы собираетесь загружать/сохранять строки без использования предоставленного API, вы должны понимать и поддерживать эти флаги по мере необходимости. Для правильной установки Save/Update для работы нужно правильно настроить. –

1

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

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

Если вы загружаете существующую запись _IsNew является false и _isLoaded является true. Когда вы сохраняете его, он обновляет UPDATE и обновляет только грязные столбцы.

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

[BTW Вы ошибаетесь сеттера - их называют объект Инициализатором.]

+0

Спасибо. Я отредактировал мой вопрос, чтобы исправить мою ошибку. Код, который я опубликовал, - это все «сопоставление» кода, это дозвуковой объект, который он загружается привязкой автоматической модели mvc.net, а затем я обновляю. параметр isLoaded to true не помогает, поскольку свойства не загрязнены. есть ли способ, которым я могу использовать автоматическое связывание? – Daniel