为什么我的DbContext被处理?我怎么能阻止它或解决它?

时间:2018-01-08 23:24:13

标签: c# entity-framework xunit.net aspnetboilerplate

我在这个单元测试的最后一行上的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);

我没有收到错误(并且得到我的父记录),但是我似乎没有选择填充我的Payments集合。

我没有故意将DbContext置于任何地方。事实上,据我所知,我唯一能触及的地方是为这两个表添加DbSet,并在OnModelCreating()中建立HasMany关系。

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

1 个答案:

答案 0 :(得分:1)

您可以明确地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]属性未用于Test方法,因为可能不会注入Test类。