代码之家  ›  专栏  ›  技术社区  ›  Rupert Morrish

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

  •  -1
  • Rupert Morrish  · 技术社区  · 8 年前

    在这个单元测试的最后一行,我在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关系。

    我曾尝试在测试中添加[工作单元],这是我在其他地方能找到的唯一建议,但它并没有改变行为。

    1 回复  |  直到 8 年前
        1
  •  1
  •   aaron    8 年前

    你可以 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] 属性不用于测试方法,因为测试类可能不会被注入。