Я использую 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 с использованием автоматической привязки модели.