2017-09-19 8 views
1

私は本からC#でEFを使用してASP.NET MVCプロジェクトに取り組んでいます。この部分は異なるセッションから同時にエンティティを更新しないようにするためです。 この本は素晴らしいですが、残念ながらこの部分では説明が十分ではなく、誰かが私の理解を助けることができれば感謝します。 私は無関係なコードを省略しようとします。それは本当に簡単ですので、モデルは、基本的には唯一つのプロパティ「名前」を持っている:ここではDbEntityEntry OriginalValues対TryUpdateModel並行更新を避けるためのRowVersion

[HttpPost] 
public ActionResult Edit(int? id, byte[] rowVersion) 
{ 
    string[] fieldsToBind = new string[] { "Name", "RowVersion" }; 
    var categoryToUpdate = db.Categories.Find(id); 
    if (TryUpdateModel(categoryToUpdate, fieldsToBind)) 
     { 
      try 
      { 
       db.Entry(categoryToUpdate).OriginalValues["RowVersion"] = 
        rowVersion; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (DbUpdateConcurrencyException ex) 
      {//... and the code goes on to handle the concurrent update 
      // scenario 
      } 

は、私は理解していないものです: をTryUpdateModelメソッドが正常にモデルを更新した場合、および新しい値「名前」をバインドと "RowVersion"(ビューで提供されていました)のどちらを使用すればいいですか?この行をインクルードする必要があります:db.Entry(categoryToUpdate).OriginalValues ["RowVersion"] = rowVersion ;?このラインは何を正確にしていますか?例外がスローされる必要があるのはなぜですか? ありがとう

答えて

0

これはEFが内部でどのように動作するかに関連しています。このステートメントのUPDATEコマンドを生成するとき、EFはRowValue値がOriginalValuesに存在する行を探します。 db.Categories.Find(id);

エンティティの最新の値がこの行をDBからロードされているので、変更しない限り、何の同時実行例外は存在しません:行は、エンティティが、このラインをDBからロードされるため、追加する必要があることを

RowValue値はOriginalValuesに格納されます。

エンティティがDBからロードされず、更新がコンテキストにアタッチされて実行された場合、OriginalValuesにRowVersionを設定する必要はありません。

関連する問題