2012-01-08 22 views
0

mvcアプリケーションで私のDBにアクセスするために亜音速を使用しています。 mvcモデルバインディングを使用してレコードを更新しようとすると、列のどれもがダーティとマークされていないため、レコードは更新されません。mvcモデルバインディングを使用してSubsonicアップデートを使用する方法?

私は亜音速のコードを微調整することにより、汚れなど、すべての列をマークする手動で試してみましたが、時々私は私がダーティとしてそれらすべてをマークしたくないので、いくつかのプロパティを更新します。

これを行う最善の方法は何ですか?

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:私はこのコードを試してみた

が問題で参照するには

 [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"); 
     } 

これは私が亜音速のコードを微調整する方法である:

この

は自分の行動であります嘘:

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

これも機能しませんが、列が汚れていません。オブジェクトの初期化子を使用すると、setterが呼び出されないため、列がダーティに設定されていないようです。

は、私は、デフォルトのmvc.netモデルは、このような作品を結合することを前提となり、レコードが更新されていない理由です。

編集2

私の最初の編集はdyork12が指摘したように@間違っています。 サブソニックは 'isLoaded'フラグを使用します。このフラグがfalseに設定されている場合、プロパティはダーティーとして設定されません。これはレコードをロードするときに亜音速で使用され、読み込み中にプロパティを設定してダーティーとして設定しないようにします。

しかし、私の質問は、自動モデルバインディングを使用してmvc.netビューから亜音速のオブジェクトを編集するための最適な回避策は何か残っています。

+0

ViewSonicで生成されたオブジェクトをバインドしているか、ViewModelを使用していますか?これを見たことがありますか? http://stackoverflow.com/questions/5491733/subsonic-and-automapper-dirtycolumns-collection-is-empty-therefore-cant-updat – DaveHogan

+0

なぜ汚れとマークされていませんか?そのコードフラグメントはActiveRecordに由来し、カラムプロパティにバインドするとすべて正常に動作するはずです。何をやっているのですか?もっとコードをお願いします。 –

+0

@ dyork12:私は '編集'に答えました。 – Daniel

答えて

0

ので、元の問題は、(今理解されるように)MVCは何とか設定せずに行をロードし、彼らのためにDALのオブジェクトを作成することですisLoadedフラグを設定し、setterへの呼び出しがdirtyColumnsリストに追加されないようにします。 setterが呼び出される前に、レコードがロードされDALオブジェクトが作成された後にisLoadedを設定する方法を見つける必要があります。

申し訳ありませんが、私はMVCを助けてくれると分かりませんし、その部分にコードは含まれていません。何らかのイベントを挿入したり、何かから継承したり、テンプレートなどを変更したりすることが期待されます。 isLoadedを設定する方法を見つけたら、問題を解決します。私は願います。

+0

私はこれが行く方法だと思います。しかし、isLoadedフラグの働きが私の心には直感的ではなく、そこにはいけません。サブソニックがDBからレコードを読み込むときに問題がある場合、読み込みフラグを設定してからそれを解除する必要があります。これは亜音速のユーザーには見えません。 – Daniel

+0

ロードされたフラグとダーティー・フラグを持つのは一般的なパターンです。ロードされたフラグは、行がデータベースから取得されたことを示します。汚れた旗はそれが修正されたと言います。一緒にすべての組み合わせをカバーします。提供されたAPIを使用せずにローをロード/セーブする場合、必要に応じてこれらのフラグを理解して維持することは、あなたの責任です。保存/更新が正しく機能するように正しく設定する必要があります。 –

1

私はパントを取って、答えが_isLoadedが偽であると思うと言います。より多くのコードを見ることなく、私はあなたになぜそれを伝えることができません。

新しいレコードを作成する場合、_isNewは真であると_isLoadedはfalseです。保存すると、INSERTが実行され、ダーティな列は無視されます。

あなたは_IsNewがfalseで_isLoadedが真である既存のレコードをロードした場合。保存すると、UPDATEが実行され、ダーティー・カラムのみが更新されます。

あなたのコード・フラグメントのセットは、偽_isNewが、真_isLoaded設定しません。列はダーティとマークされていないので、何も保存されません。これは、ActiveRecordで生成されたコードを読むことで簡単に確認できます。

[ところであなたはセッターについて間違っている - 。彼らは、オブジェクト初期化子で呼ばれている]

+0

ありがとうございます。私は間違いを修正するために私の質問を編集しました。私が投稿したコードは、すべてのコード 'マッピング'はmvc.netの自動モデルバインディングによって読み込まれ、その後私は更新する亜音速オブジェクトです。プロパティが汚れていないので、isLoadedをtrueに設定しても効果はありません。自動バインディングを使用する方法はありますか? – Daniel

関連する問題