首页 > 解决方案 > 尝试添加或更新嵌套对象时如何绕过错误 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; }

    }

标签: c#entity-frameworkentity-framework-core

解决方案


当当前版本及其数据库版本中的记录的属性发生更改时,通常会发生此错误。

根据代码,唯一更改的值是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; }

另外,可能在其他字段上启用了并发检查


推荐阅读