我使用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框架与数据库通信。