为什么要处置我的 DbContext?我怎样才能阻止它或解决它?

Why is my DbContext being disposed? How can I stop it or work around it?

在此单元测试的最后一行,我的 dbContext 对象出现 ObjectDisposedException:

public class InvoiceRepository_Tests : AppTestBase
{
    [Fact]
    public async Task Test_InsertAndQuery()
    {
        var invoiceRepository = Resolve<IRepository<InvoiceHistory, long>>();
        var invoice = new InvoiceHistory() { Reference = "1", Payments = new List<Payment> { new Payment() } };
        var ihId = await invoiceRepository.InsertAndGetIdAsync(invoice);
        var readInvoice = await invoiceRepository
            .Query(q => q.Where(ih => ih.Id == ihId))
            .Include(ih => ih.Payments)
            .FirstOrDefaultAsync();
    }
}

如果我将最后一行替换为:

        var readInvoice = invoiceRepository.Get(ihId);

我没有收到错误消息(并且确实收到了我的父记录),但我似乎无法填充我的付款集合。

我不是故意在任何地方处理 DbContext。事实上,据我所知,我唯一接触过的地方是为这两个表添加 DbSet 并在 OnModelCreating() 中建立 HasMany 关系。

我已经尝试将 [UnitOfWork] 添加到测试中,这是我在其他地方可以找到的唯一建议,但它并没有改变行为。

您可以 Begin UnitOfWork 显式:

[Fact]
public async Task Test_InsertAndQuery()
{
    var invoiceRepository = Resolve<IRepository<InvoiceHistory, long>>();
    var unitOfWorkManager = Resolve<IUnitOfWorkManager>();

    using (var uow = unitOfWorkManager.Begin())
    {
        var invoice = new InvoiceHistory() { Reference = "1", Payments = new List<Payment> { new Payment() } };
        var ihId = await invoiceRepository.InsertAndGetIdAsync(invoice);
        var readInvoice = await invoiceRepository
            .Query(q => q.Where(ih => ih.Id == ihId))
            .Include(ih => ih.Payments)
            .FirstOrDefaultAsync();

        // ...

        await uow.CompleteAsync();
    }
}

[UnitOfWork] 属性未用于测试方法,因为可能无法注入测试 class。