乐观并发异常



我已经和这个错误斗争了一段时间了。我希望把它放在这里会有所帮助。
我所附加的模型和方法调用也正在进行。当我试图在创建产品时保存更改时发生错误。

这是由控制器调用的方法来发出HttpPost请求。

//Manager
public async Task<Envelope<ProductViewModel>> CreateProduct(ProductViewModel model)
{
model.ValidateProductModel();
var product = new Product
{
Name = model.Name,
Price = model.Price,
ImageUrl = model.ImageUrl,
Description = model.Description
};
var category = await _categoryRepository.GetCategoryName(model.Category.Name);
category.Products.Add(product);
//_categoryRepository.UpdateEntity(category);
await _categoryRepository.SaveChangesAsync();
//_context.SaveChanges();
ProductViewModel savedProduct = _mapper.Map<Product, ProductViewModel>(product);
return Envelope.Ok(savedProduct);
}

这是我的模型类

//Models
public class Category : DbGuidEntity
{
public string Name { get; set; }
public List<Product> Products { get; set; }
public Category()
{
Products = new List<Product>();
}
public Category(CategoryViewModel model)
:this()
{
model.ValidateCategoryModel();
Name = model.Name;
}
}
public class Product : DbGuidEntity
{
public Product()
{
}

[Required]
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
[ForeignKey("Category")]
public Guid CategoryForeignKey { get; set; }
[JsonIgnore]
public Category Category { get; set; }
public string ImageUrl { get; set; }
}

然后,这里是我的save changes方法和by controller

//SaveChanges Method
public async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default, bool clearChangeTracker = false)
{
var result = await DbContext.SaveChangesAsync(cancellationToken);
if (clearChangeTracker)
ClearChangeTracker();
return result;
}
//Create Product Controller
[HttpPost("Create")]
[Produces(typeof(Envelope<ProductViewModel>))]
public async Task<IActionResult> Create(ProductViewModel model)
{
try
{
var product = await _productManager.CreateProduct(model);
return Done(product);
}
catch (ShoppingMartException sx)
{
LogError("Error occured while attempting to create product:", sx, model);
return Failure(sx.Errors);
}
catch (Exception ex)
{
LogError("Product Creation error occured", ex);
return Failure($"An error occured | {ex.Message}");
}
}

ErroMessage:

数据库操作预期影响1行,但实际影响0行。数据可能已经被修改或删除实体被加载。看到浏览网址:http://go.microsoft.com/fwlink/?LinkId=527962理解和处理乐观并发异常。">

所以,我终于找到了一个解决我的问题的方法。基本上,由于某些原因,EFCore没有跟踪我的产品实体。

我需要首先检查createProduct方法中每个实体的状态,如下所示。

_context.Entry(product).Context;
_context.Entry(category).Context;

我发现产品实体的状态是Detached(这意味着未跟踪),而类别实体的状态是Unchanged。

所以,我所做的是手动指示EFCore跟踪我的产品实体,像这样;

_context.Entry(product).State = EntityState.Added;

这只是将实体的状态设置为已添加,这意味着它将在调用savechanges时插入到数据库中。

最新更新