Как правильно обновить ContentItem в Orchard?

Я пытаюсь обновить конкретную часть с помощью следующего кода:

var nationalPart = _contentManager.Get<NationalPart>(Id);      
nationalPart.Name = part.Name;

я уже сделал это. но теперь это не работает. даже я звоню contentManager.Flush() явно, но все же не повезло. Кто-нибудь может мне с этим помочь? заранее спасибо.

РЕДАКТИРОВАТЬ: я нашел, откуда исходит моя проблема! Когда я делаю JSON-запрос на обновление contentPart.The в памяти версии обновляется, но это не отражает результат для db.now, мы на один шаг ближе к answer.but что мешает сессии обновить update db?

EDIT2:

это код моего обработчика:

        public NationalPartHandler(IRepository<NationalPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
        }

это код для действия контроллера:

    [GridAction(EnableCustomBinding = true)]
    public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command)
    {
         if (!ModelState.IsValid)
            return new JsonResult { Data = "error" };
        var NationalPart = _contentmanager.Get(Model.Id).As<NationalPart>();
        NationalPart.Record = new NationalPartRecord();
        NationalPart.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model);
        _soccerService.UpdateNational(NationalPart);         
        return NationalsListJson(Command);
    }

и, наконец, код для службы:

public void UpdateNational(NationalPart part)
{
    var nationalPart = _contentManager.Get<NationalPart>(part.Id);      
    nationalPart.Name = part.Name;
    _contentManager.Flush();
}

1 ответ

Решение

Удалить строку

NationalPart.Record = new NationalPartRecord();

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

UpdateNational является избыточным, и вы можете удалить его - у вас уже есть part.Name (который, если я правильно понимаю, должен отображаться на part.Record.Name), установленный во время вызова record.MapFrom,

Таким образом, правильная версия будет выглядеть так

[GridAction(EnableCustomBinding = true)]
public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command)
{
     if (!ModelState.IsValid)
        return new JsonResult { Data = "error" };
    var part = _contentmanager.Get(Model.Id).As<NationalPart>();
    part.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model);        
    return NationalsListJson(Command);
}

учитывая, что ваш NationalPart выглядит примерно так:

public NationalPart : ContentPart<NationalPartRecord>
{
    public string Name {
        get { return Record.Name; }
        set { Record.Name = value; }
    }
}

Подводя итоги - если вы хотите сохранить некоторые данные в Orchard, все, что вам нужно сделать, это установить значение какого-либо свойства записи, не более того. Данные будут сохранены в конце запроса (или ранее, если вы позвоните IContentManager.Flush()).

Другие вопросы по тегам