2016-07-19 4 views
0

私のmvcアプリケーションでは、関連するデータがたくさんあるので、その関連データの編集/更新を可能にするメソッドを記述する必要があります。 ViewModel。私はこれを行うメソッドを作成しようとしましたが、正しく動作するようにはできません。私のアプローチが正しいとは確信が持てません。ここで 関連するデータの編集メソッドを書くにはどうすればいいですか?

は私のコードです:

コントローラコード

[HttpPost] 
[ValidateAntiForgeryToken] 
    public ActionResult Edit(FullVesselViewModel model) 
    { 
     var vessel = new tbl_vessels 
     { 
      vessel_idx = model.vessel_idx, 
      vessel_name = model.vessel_name 
     }; 
     var vessel_spec = new tbl_vessel_spec 
     { 
      spec_idx = model.spec_idx, 
      bhp = model.bhp 
     } 
     using (var context = new dataEntities()) 
     { 
      context.Entry(vessel).State = EntityState.Modified; 
      context.Entry(vessel_spec).State = EntityState.Modified;        
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
    } 

私の最初かのようにこれらの変数をcomitting、私のviewmodelを宣言して、二つの関連エンティティを打破し、変数に保存することでした変更を保存してから変更を保存します。私の上記のアプローチは並行性エラーを返します。私はエンティティのインデックスをいくつかの隠しフィールドに格納して、それが役立つかどうかを確認しましたが、運がなかったのです。

ビュー

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.vessel_idx) 
    @Html.HiddenFor(model => model.spec_idx) 


    ...input fields etc ... 
} 

私はシナリオのこの種のために正しい思考や簡素に行うことができる設計何かの上に私を持っていますか?

私が取得エラー)(次のようであるとのSaveChangesでトリガーされます。

Entity Framework: “Store update, insert, or delete statement affected an unexpected number of rows (0).” 
+0

モデル - ビュー - コントローラタグはパターンに関する質問のためであることに注意してください。 ASP.NET-MVCの実装には特定のタグがあります。 –

+0

どのような同時実行エラーが発生しましたか?通常、同様のケースでは、lambdaまたはLINQの照会で一致したデータが最初に見つかります。データが存在する場合は、変更内容をDBに保存するために 'this.UpdateModel'および' context.SaveChanges() 'を実行します。 –

+0

@TetsuyaYamamotoのエラーを追加しました – Yanayaya

答えて

0

&はEF例外の発生源としてcontext.SaveChanges()を見つけ、あなたのコードを分析した後、あなたは、適したこれらのソリューションの1つを選択することができますあなたの問題。主キーを変更せずに

using (var context = new dataEntities()) 
{ 
    context.Entry(vessel).State = EntityState.Added; 
    context.Entry(vessel_spec).State = EntityState.Added;        
    context.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

やデータの一致を発見した後、あなたのコントローラのアクション内のTryUpdateModelを使用し、場合にあなたがデータの更新が必要になります:Added

変更EntityState変更を保存する前に、

var foundvessel = context.tbl_vessels.Where(x => x.vessel_idx == model.vessel_idx).FirstOrDefault(); 

var foundvspec = context.tbl_vessel_spec.Where(x => x.spec_idx == model.spec_idx).FirstOrDefault(); 

if (foundvessel != null && foundvspec != null) 
{ 
    var vessel = new tbl_vessels 
    { 
     vessel_idx = model.vessel_idx, 
     vessel_name = model.vessel_name 
    }; 
    var vessel_spec = new tbl_vessel_spec 
    { 
     spec_idx = model.spec_idx, 
     bhp = model.bhp 
    } 

    using (var context = new dataEntities()) 
    { 
     this.TryUpdateModel(vessel); 
     this.TryUpdateModel(vessel_spec);        
     context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
} 

EFさん生成されたエラーは、いくつかのテーブルの主キー値を更新しようとしている、オプティミスティックな同時実行例外を示します。つまり、vessel_idx & spec_idxは、各ターゲット表からの主キーです。EFは、既存のデータに対する更新ではなく、新しい行の追加としてそれらを変更します。主キーが

任意の改善や提案を歓迎そのまま既存の場合は、新しい主キーが

  • EntityState.Modifiedを追加した場合

  • 関連する問題