You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:23:32