DBConcurrencyException试图在Update中返回NotFound()



我尝试实现微软的API更新,如下所示。首先,我从数据库中获取记录,以确定它是否为空。如果不是,将触发更新。在代码中,efCore抛出DBConcurrencyException,因为元素已经被跟踪了。

怎么了?

// PUT api/contactsconvention/{guid}
[HttpPut("{id}")]
[ApiConventionMethod(typeof(DefaultApiConventions), 
nameof(DefaultApiConventions.Put))]
public IActionResult Update(string id, Contact contact)
{
// First tracking in my code
var contactToUpdate = _contacts.Get(id);
if (contactToUpdate == null)
{
return NotFound();
}
// Second tracking in my code -> Exception at dbContext.SaveChanges()
_contacts.Update(contact);
return NoContent();
}

. get方法后面必须是一个非变更跟踪方法。所以我添加了它,现在它工作了。

// PUT api/contactsconvention/{guid}
[HttpPut("{id}")]
[ApiConventionMethod(typeof(DefaultApiConventions), 
nameof(DefaultApiConventions.Put))]
public IActionResult Update(string id, Contact contact)
{
// First tracking in my code
var contactToUpdate = _contacts.GetAsNoTracking(id);
if (contactToUpdate == null)
{
return NotFound();
}
// Second tracking in my code -> Exception at dbContext.SaveChanges()
_contacts.Update(contact);
return NoContent();
}
// Non-tracking repository method:
return context.Contacts.AsNoTracking().Single(s => s.Id == id);

我也有一个问题,我的UnitTests使用模拟dbSet。AddRange方法还添加了ChangeTracking值。这些可以用下面的代码删除,在这篇文章中描述。

foreach (var entity in InMemoryScheduleDbContext.ChangeTracker.Entries())
{
entity.State = EntityState.Detached;
}

最新更新