在EF Core 1.1中保存记录时出现DbUpdateConcurrencyException错误

时间:2017-04-20 13:34:40

标签: c# entity-framework asp.net-web-api concurrency .net-core

我使用EF Core 1.1获得ASP .Net Core 1.1 Web Api

我有一个控制器在执行帖子时被触发:

// POST: api/People
[HttpPost]
public async Task<IActionResult> PostPerson([FromBody] Person person)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    _context.Person.Add(person);
    await _context.SaveChangesAsync();

    string uri = CreateUri(person.PersonId);
    person.Uri = uri;
    await _context.SaveChangesAsync();
    return CreatedAtAction("GetPerson", new { id = person.Id }, person);
}

如您所见,此控制器将新的Person记录添加到数据库。然后,它获取新创建的人员的ID号以生成该人的URI,并将该URI保存回数据库。第一个SaveChangesAsync()完美地工作,并在数据库中创建一个新的人员记录。紧接着,Person对象已经自动填充了新创建的Person ID。但是,当我调用第二个SaveChangesAsync()时,我收到此错误:

  

数据库操作预计会影响1行但实际上会影响0   行(S)。自实体以来,数据可能已被修改或删除   加载。请参阅http://go.microsoft.com/fwlink/?LinkId=527962   有关理解和处理乐观并发的信息   异常。

     

来源 =&#34; Microsoft.EntityFrameworkCore.Relational&#34;

     

目标 = ThrowAggregateUpdateConcurrencyException

堆栈追踪:

  

在   Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(的Int32   commandIndex,Int32 expectedRowsAffected,Int32 rowsAffected)at   Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.d__6.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.d__2.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.Update.Internal.MySqlModificationCommandBatch.d__19.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.Update.Internal.MySqlBatchExecutor.d__1.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__54.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.d__52.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.EntityFrameworkCore.DbContext.d__35.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()   在   InspectionsWebApi.Controllers.PeopleController.d__5.MoveNext()   在   C:\ Users \用户fabsr \源\回购\ InspectionsWebApi \ InspectionsWebApi \控制器\ PeopleController.cs:线   78

更具体地说,这似乎是DbUpdateConcurrencyException错误。

我是唯一一个访问数据库或使用此Web API的人。 我尝试在第二个SaveChanges之前将对象重新连接到上下文:

...
person.Uri = uri;
_context.People.Attach(person);
await _context.SaveChangesAsync();
...

但同样的错误。我在第一次SaveChanges()之后尝试重新取这个人:

...
person = _context.People.Find(person.Id);
person.Uri = uri;
await _context.SaveChangesAsync();
...

但同样的错误。 我在第二个SaveChanges():

之前尝试过这个
...
var entry = _context.Entry(person);
entry.Property(e => e.Url).IsModified = true;
await _context.SaveChangesAsync();
...

但同样的错误......有什么想法吗?后端是MySQL服务器数据库,我使用Pomelo框架与数据库通信。

0 个答案:

没有答案