如何使用工作单元来保存使用 Entity Framework Core 和 .NET 1:1 相关的两个实体?

问题描述 投票:0回答:1

我的 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。

c# .net entity-framework-core unit-of-work
1个回答
0
投票

您应该在工作单元类中拥有存储库类型的属性。 只有通过工作单元,您才能访问您的存储库。

 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();
 }

}

© www.soinside.com 2019 - 2024. All rights reserved.