我的 UserRepository 上有以下代码:
public async Task RegisterUser(UserAggregate userAggregate)
{
try
{
await _context.UserAggregates.AddAsync(userAggregate);
await _shoppingCartRepository.CreateShoppingCart(userAggregate.UserAggregateId);
await _unitOfWork.Commit();
}
catch (Exception)
{
await _unitOfWork.Rollback();
throw;
}
}
在 ShoppingCartRepository 上我有一个非常标准的代码:
public async Task CreateShoppingCart(int userAggregateId)
{
var shoppingCart = new ShoppingCart
{
UserAggregateId = userAggregateId,
OrderItems = Utils.Serializer(new List<OrderItem>())
};
await _context.ShoppingCarts.AddAsync(shoppingCart);
}
这是我的工作单元实现:
public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;
public UnitOfWork(AppDbContext context)
{
_context = context;
}
public async Task<bool> Commit()
{
return await _context.SaveChangesAsync() > 0;
}
public Task Rollback()
{
return Task.CompletedTask;
}
}
问题是:“Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时发生错误。有关详细信息,请参阅内部异常。 ---> MySqlConnector.MySqlException (0x80004005):无法添加或更新子行:外键约束失败 (
bytestore
.shoppingcarts
,约束 FK_ShoppingCarts_Use rAggregates_UserAggregateId
外键 (UserAggregateId
) 参考 useraggregates
() Id
)删除级联)”
这意味着我正在尝试在 ShoppingCart 上创建 UserAggregateId_FK,即使 UserAggregate 上的 PK 不存在。我可以做什么来使用工作单元并确保交易完全发生?
我尝试使用两个
_context.SaveChangesAsync()
,每个 AddAsync 之后一个,但这绝不是一个工作单元实现,可能会让用户在数据库上没有 ShoppingCarts,所以我决定使用 UoW。
您应该在工作单元类中拥有存储库类型的属性。 只有通过工作单元,您才能访问您的存储库。
public class UnitOfWork
{ 私有只读 yourContext _context;
public UnitOfWork(yourContext context, IUserRepository user)
{
_context = context;
_User = user;
}
public IUserRepository _User { get; private set; }
public int Complete()
{
return _context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}