0

MS-SQL データベースで Entity Framework を使用しています。「応答セット」を更新するために PUT Web エンドポイントを実装しています。

呼び出し元が forceSave = true を示している場合、 RowVersionが一致しない場合でも、レコードを上書きしたいと考えています。

これは私のコードですが、動作しません....

    [HttpPut, Route("ResponseSets/{id:int}")]
    public IHttpActionResult UpdateResponseSet(int id, 
               [FromBody] ResponseSet responseSetForUpdate, 
               [FromUri]bool? forceSave = false)
    {
        var db = new MyContext();
        var responseSet = db.ResponseSets.FirstOrDefault(x => x.ResponseSetId == id);
        if (!responseSet.RowVersion.SequenceEqual(responseSetForUpdate.RowVersion) && !forceSave.Value)
        {
            return new NegotiatedContentResult<LockingUser>(HttpStatusCode.Conflict,
                new LockingUser(responseSet.LastUpdatedByUser), this);
        }
        responseSet.ResponseData = responseSetForUpdate.ResponseData;
        responseSet.LastUpdatedByUser = HttpContext.Current.User.Identity.Name ?? "Anonymous";
        responseSet.LastUpdatedDateTime = DateTime.Now;
        db.SaveChanges();
        return Ok();
    }

ほとんどの場合、それは機能します!ただしDBConcurrencyExceptionSaveChanges(). 競合状態があるためだと思います。データベースを読み取った後、別のプロセスFirstOrDefaultでデータベースを書き込む前にSaveChanges、行が更新され、RowVersion が変更される可能性があります。RowVersion チェックを無効にする方法はありますか?

トランザクションの開始/終了を使用することを考えましたが、明らかにそれは役に立ちません。

DBConcurrencyException を取得した場合に、RowVersion を再度読み取り、再度書き込みを試行するようにループを作成することを考えました...成功するまで...しかし、ハッキーな感じがします。

4

0 に答える 0