【发布时间】:2023-04-07 02:27:01
【问题描述】:
以下是相关类及其配置:
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ProductId { get; set; }
[Required]
public string ProductName { get; set; }
public ICollection<ProductSpecification> ProductSpecifications { get; set; }
}
public class ProductAttributeValue
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ProductAttributeValueId { get; set; }
[Required]
public string ProductAttributeValueName { get; set; }
public ICollection<ProductSpecification> ProductSpecifications { get; set; }
}
public class ProductSpecification
{
public long ProductId { get; set; }
public long ProductAttributeValueId { get; set; }
public string Note { get; set; }
public Product Product { get; set; }
public ProductAttributeValue ProductAttributeValue { get; set; }
}
// Configuration in the dbConext
modelBuilder.Entity<ProductSpecification>().HasKey(ps => new { ps.ProductId, ps.ProductAttributeValueId });
modelBuilder.Entity<ProductSpecification>().HasOne(p => p.Product).WithMany(ps => ps.ProductSpecifications).HasForeignKey(ps => ps.ProductId);
modelBuilder.Entity<ProductSpecification>().HasOne(pav => pav.ProductAttributeValue).WithMany(ps => ps.ProductSpecifications).HasForeignKey(ps => ps.ProductAttributeValueId);
在控制器中:
public async Task<IActionResult> UpdateProduct([FromRoute] long id, [FromBody] Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != product.ProductId)
{
return BadRequest();
}
Product productToBeUpdated = await _unitOfWork.Repository<Product>().GetEntityList(p => p.ProductId == id).Include(p => p.ProductSpecifications).SingleOrDefaultAsync();
if (productToBeUpdated == null)
{
return NotFound();
}
foreach (ProductSpecification productSpecification in productToBeUpdated.ProductSpecifications.ToList())
{
productToBeUpdated.ProductSpecifications.Remove(productSpecification);
}
productToBeUpdated.ProductSpecifications = product.ProductSpecifications;
productToBeUpdated.ModifiedOn = DateTime.UtcNow;
await _unitOfWork.SaveChangesAsync();
return Ok(true);
}
我也试过了:
foreach (ProductSpecification productSpecification in productToBeUpdated.ProductSpecifications.ToList())
{
_unitOfWork.Repository<ProductSpecifications>().DeleteEntity(productSpecification);
}
他们都抛出了以下异常:
无法跟踪实体类型“ProductSpecification”的实例,因为已经在跟踪具有相同键值 {'ProductId', 'ProductAttributeValueId'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
找不到问题的真正所在!任何帮助将不胜感激!
【问题讨论】:
标签: c# asp.net-core entity-framework-core