如何在MS-SQL中禁用rowversion检查

时间:2015-11-03 22:20:44

标签: .net sql-server concurrency rowversion

我在MS-SQL数据库上使用Entity Framework。我正在实现一个PUT Web端点来更新“响应集”。

如果调用者指示forceSave = true,即使RowVersion不匹配,我也希望 clobber 记录。

这是我的代码,但它不起作用....

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

大部分都有效!但是,有时我会从DBConcurrencyException获得SaveChanges()。我认为这是因为存在竞争条件。在用FirstOrDefault读取数据库之后但在用SaveChanges编写数据库之前,另一个进程可能会更新该行并更改RowVersion!有没有办法禁用 RowVersion检查?

我考虑使用交易开始/结束,但显然这无济于事。

我想过写一个循环,所以如果我得到DBConcurrencyException,那么它会再次读取RowVersion,并尝试再次写入......直到成功......但是jeez感觉很讨厌。

0 个答案:

没有答案