【发布时间】:2021-11-26 18:21:47
【问题描述】:
我有一个产品列表,并使用 FindAsync() 从数据库中获取他们的库存。如果FindAsync 没有得到记录,我将产品插入到带有InsertAsync() 的库存中。然后,如果我第二次为相同的产品 ID 调用 FindAsync(),我仍然没有获得 Stock 记录,并且我的代码第二次尝试将记录插入 Stock。我需要查找产品库存,如果存在库存,请更新库存数量。我怎样才能找到新插入的记录而不在 foreach 循环中调用 SaveChangesAsync()。
foreach (var product in products)
{
var stock = await stockRepository.FindAsync(product.Id);
if (stock == null)
{
stock = new Stock(SequenceGenerator.Create(SequenceType.Default), product.Id, quantity);
stock = await stockRepository.InsertAsync(stock);
}
else
{
stock.Quantity += quantity;
stock = await stockRepository.UpdateAsync(stock);
}
await uow.SaveChangesAsync();
}
【问题讨论】:
-
尝试使用 stock.Result==null(同步)
-
EF Core 中没有
InsertAsync或UpdateAsync。也没有uow或Repository。除非您发布代码,否则我们无法猜测您自己的类会做什么。不过,EF Core 没有问题,也不需要任何“存储库”或“工作单元”包装器。 DbContext 已经是一个工作单元,一个 DbSet 已经是一个存储库。在调用SaveChanges之前,DbContext 已经缓存了更改。此时,所有更改都使用单个内部事务进行持久化。 这就是 UoW 的工作方式。 -
我可能错了,但我认为在 SaveChangeAsync 完成之前不会将任何内容保存到数据库中(因此可以找到)。 EF 是一个工作单元,直到 SaveChanges 完成后 UoW 才完成。您可以跟踪尚未提交的记录而无需费心查找它们,甚至可以进行子事务。
-
“一个 DbSet 已经是一个存储库” - 对于那些坚持在其上分层另一个存储库的人来说,这是值得重复的,因为他们刚刚了解了设计模式。
-
您似乎使用了“通用存储库”反模式,破坏了 EF Core 的存储库和 UoW 功能。 DbContext 已经跟踪实体(除非您禁用更改跟踪)。
DbSet.Find在访问数据库之前将首先查找所有缓存的实体。
标签: c# .net-core entity-framework-core abp