c# - 尝试添加或更新嵌套对象时如何绕过错误 DbUpdateConcurrencyException?
问题描述
当我尝试更新或添加具有嵌套子项的实体时,按照我放置的放置逻辑出现此错误。
为什么我会收到此错误:Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。有关了解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=527962。在 Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(Int32 commandIndex,Int32 expectedRowsAffected,Int32 rowsAffected)
[HttpPut("{id}")]
public async Task<IActionResult> PutCart(string id, ProductsInCart productInCart)
{
var cart = _context.Cart.FirstOrDefault(x => x.Id == id);
var product= cart.CartItems?.FirstOrDefault(x => x.Product.Id.Equals(productInCart.Product.Id));
if (product != null)
{
product.Quantity += 1;
}
else
{
cart.CartItems = new List<ProductsInCart>(){ productInCart };
}
_context.Entry(cart).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CartExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
以下是对象:
public class Cart
{
public string Id { get; set; }
public List<ProductsInCart> CartItems { get; set; }
}
public class ProductsInCart
{
public int Id { get; set; }
public int ProductId { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
}
public class Product
{
public int Id { get; set; }
[Required, StringLength(100)]
public string ProductName { get; set; }
[Required, StringLength(10000)]
public string Description { get; set; }
public string ImagePath { get; set; }
public double? UnitPrice { get; set; }
public int? CategoryID { get; set; }
public virtual Category Category { get; set; }
public List<Review> Reviews { get; set; }
}
解决方案
当当前版本及其数据库版本中的记录的属性发生更改时,通常会发生此错误。
根据代码,唯一更改的值是Quantity
属性。检查表中的此属性ProductsInCart
。此外,如果您使用 ef 类型配置,请检查数量是否在并发检查中没有贡献。
使用 fluent API 进行并发检查:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProductsInCart>()
.Property(p => p.Quantity)
.IsConcurrencyToken();
}
和数据注释
[ConcurrencyCheck]
public string Quantity{ get; set; }
另外,可能在其他字段上启用了并发检查
推荐阅读
- ios - 更改 Xcode 11 后未找到架构 x86_64 的符号
- java - System.err.print(ln) 与 system.out.println 在同一行吗?JAVA
- python - 把Python的输入函数变成C
- reactjs - 除了异步操作之外,redux 中的“副作用”究竟是什么?
- swift - 当我物理更新我的 Firestore 数据库字段时,我的应用程序无法访问这些新字段,并显示旧字段
- tkinter - tkinter 的文件对话框询问打开文件名无法显示文件系统
- r - 如何按组查找滚动列中的前 3 个值?
- c# - 创建视图后未将对象引用设置为对象的实例
- quickfix - 如何启动/停止特定会话连接
- amazon-web-services - 如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark