如何在EF Core与.NET中使用工作单元保存1:1关联实体?已解决
问题:EF Core外键约束失败导致注册用户时购物车创建失败
代码实现
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); }
工作单元(Unit of Work)实现
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_UserAggregates_UserAggregateId外键(UserAggregateId)引用useraggregates(Id),ON DELETE CASCADE)
问题分析
错误核心原因是:创建ShoppingCart时,UserAggregate的主键还未生成,导致数据库外键约束校验不通过。
原本计划通过工作单元保证事务完整性,之前尝试在每次AddAsync后调用_context.SaveChangesAsync,但这种方式违背工作单元的设计逻辑,可能出现用户数据已存入但购物车未创建的不一致情况,因此改用工作单元方案。
解决方法
根据提示,问题出在传递UserAggregateId而非UserAggregate实体对象——EF Core无法自动处理未生成的用户ID关联。修复代码后无需依赖工作单元,只需调用一次_context.SaveChangesAsync即可完成用户和购物车的原子性存储。
内容的提问来源于stack exchange,提问作者Arthur Amorim
相关产品推荐
相关产品推荐

