5

次のコードで特定の部分を更新しようとしています:

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

私はすでにこれを行っていますが、今は機能しcontentManager.Flush()ていません。明示的に呼び出しても、まだ運がありません。誰でもこれで私を助けることができますか?前もって感謝します。

編集:私は私の問題がどこから来たのかを見つけました!contentPart を更新する JSON リクエストを作成すると、メモリ内のバージョンは更新されますが、結果が db に反映されません。これで、回答に一歩近づきました。しかし、セッションが 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();
}
4

1 に答える 1

6

線を取り除く

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()

于 2012-10-16T09:23:14.477 に答える