Estoy tratando de agregar a una relación de uno a muchos. Una vez que intento guardar el producto recién creado usando
context.saveChangesAsync() company.Products.Add(x)No me permitirá - Obtengo una excepción:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: se esperaba que la operación de la base de datos afectara a 1 fila, pero en realidad afectó a 0 filas; los datos pueden haber sido modificados o eliminados desde que se cargaron las entidades.
No puedo averiguar dónde se está modificando. Espero que me puedan ayudar. Gracias por adelantado.
public async Task<Result<ProductDto>> Handle(Command request, CancellationToken cancellationToken) { var company = await _context.Companies .Include(x => x.Products) .SingleOrDefaultAsync(a => a.UserId == _userAccessor.GetUserId()); if (company != null) { var productToAdd = new Product { Name = request.Product.Name, Description = request.Product.Description, SalePrice = request.Product.SalePrice, }; company.Products.Add(productToAdd); var result = await _context.SaveChangesAsync() > 0; if (!result) return Result<ProductDto>.Failure("failed to create product"); } return Result<ProductDto>.Success(request.Product); } public class Product : BaseEntity { public Company Company { get; set; } public Guid CompanyId { get; set; } public string Name { get; set; } public string Description { get; set; } public decimal SalePrice { get; set; } public decimal CostPrice { get; set; } public int VatPercentage { get; set; } = 25; } public class Company : BaseEntity { public string CompanyName { get; set; } public string Address { get; set; } public string Zipcode { get; set; } public string City { get; set; } public string TaxId { get; set; } public string UserId { get; set; } public AppUser User { get; set; } public ICollection<Product> Products { get; set; } = new List<Product>(); }No sé por qué y parece que no puedo encontrar el problema y lo que estoy haciendo mal. Mi relación de constructor está establecida:
modelBuilder.Entity("Domain.Entities.Company", b => { b.Navigation("Products"); }); b.HasOne("Domain.Entities.Company", "Company") .WithMany("Products") .HasForeignKey("CompanyId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("Company");intente esto, de esta manera no necesita usar .Include(x => x.Products) para cargar la lista de todos los productos. Puede ahorrar algo de tráfico de red y tiempo. Y agregar a la lista de productos funcionará para una nueva empresa. Cuando descarga una empresa existente, ef la rastrea y, a veces, da una excepción.
if (company != null) { var productToAdd = new Product { CompanyId=company.Id, Name = request.Product.Name, Description = request.Product.Description, SalePrice = request.Product.SalePrice, }; _context.Products.Add(productToAdd); var result = await _context.SaveChangesAsync(); if (result == 0) return Result<ProductDto>.Failure("failed to create product"); }