ConcurrencyCheck在第一次单个更新时抛出OptimisticConcurrencyException

时间:2016-07-12 21:59:14

标签: c# asp.net-mvc mongodb entity-framework

我正在做一个简单的更新,如果我不能修改我用[ConcurrencyCheck]属性修饰的字段,它就会起作用。

这是我的财产:

[Required]
[Index]
[Display(Name="First Name")]
[ConcurrencyCheck]
public string firstname { get; set; }

这是我的更新操作方法:

[HttpPost]
[Err()]
public async Task<ActionResult> Edit(Entries entry)
 {
     if (ModelState.IsValid)
     {
            CtxRepoRBMS<CarlCtx, Entries> ctxRDMS = HttpContext.GetOwinContext().Get<CtxRepoRBMS<CarlCtx, Entries>>();
            MongoRepo<Items> ctxMongo = new MongoRepo<Items>(client: new MongoClient("mongodb://localhost"), dbName: "items");

            ctxRDMS.Update(entry);
            ctxRDMS.Save();

ctxRDMS.Update是:

public void Update(Cls entry)
{
       ctx.Entry(entry).State = EntityState.Modified;
}

ctxRDBMS.Save

public void Save()
{
   ctx.SaveChanges();
}

如果我将修改除firstname之外的其他属性,则更新正常工作,但是一旦我更改并保存它将会抛出OptimisticConcurrencyException,这是没有意义的,因为没有还有一个人在我之外编辑firstname

1 个答案:

答案 0 :(得分:0)

我想我已经弄清楚了。

如果一列用[concurrencycheck]装饰,则该列不能更改而不会引发并发异常(至少我不能更改它)。

文档中都没有这么清楚地说明这一点,我所看到的示例通常在其示例中选择一些可以在数据有效期内更改的列(在某些情况下,姓氏)。

共识似乎是使用SQL Server中的ROWVERSION列作为模型中唯一的并发令牌。