DBContext и AsNoTracking при выполнении нескольких вызовов Async / Await - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь добавить «AsNoTracking» к некоторым из моих вызовов БД, но продолжаю сталкиваться с проблемами.

У меня есть следующий код:

    public class MyRepository
{
    private readonly CustomsDataContext _context;

    public AggregatedCustomsDataRepository(CustomsDataContext context)
    {
        _context = context;
    }

    public async Task<List<AggregatedCustomsDataRow>> GetAggrigatedDataRowsCompanyNumber(string companyNumber, DateTime fromDate, DateTime toDate)
    {
        return await _context.AggrigatedDataRows
            .Where(x => x.companyNumber == companyNumber && 
                        fromDate <= x.FromDate && toDate >= x.ToDate)
            .AsNoTracking()
            .ToListAsync();
    }

    public async Task<IEnumerable<AggregatedCustomsDataRow>> GetAggregatedCustomsDataForPeriod(DateTime fromDate, DateTime toDate)
    {
        return await _context.AggrigatedDataRows
            .Where(x => fromDate <= x.FromDate && toDate >= x.ToDate)
            .AsNoTracking()
            .ToListAsync();
    }

    public async Task<IEnumerable<AggregatedCustomsDataRow>> GetAggrigatedDataRowsLastYear()
    {
        var periodFrom = DateTime.UtcNow.AddMonths(-12);
        var periodTo = DateTime.UtcNow;

        return await _context.AggrigatedDataRows
            .Where(x => x.FromDate >= periodFrom && x.ToDate <= periodTo)
            .AsNoTracking()
            .ToListAsync();
    }   
}

public MyController
{
    MyRepository _repo;
    MyOtherRepository _otherRepo;

    public async Task<IEnumerable<OutgoingDataRow>> DoWork(DateTime fromDate, DateTime toDate)
    {
        var allData = _repo.GetAggregatedCustomsDataForPeriod(fromDate, toDate);
        var allDataCompanyA = _repo.GetAggrigatedDataRowsCompanyNumber("CompA", fromDate, toDate);
        var allDataCompanyB = _repo.GetAggrigatedDataRowsCompanyNumber("CompB",fromDate, toDate);
        var allDataLastYear = _repo.GetAggrigatedDataRowsLastYear();

        Task.WaitAll(allData, allDataCompanyA, allDataCompanyB);

        return (await _otherRepo.GetAllProductTypes()).Select(ProductType) =>
        {
            var tempA = allData.Result.Where(x=>x.ProductType.Code = ProductType.Code)
            var tempB = allDataCompanyA.Result.Where(x=>x.ProductType.Code = ProductType.Code)
            var tempC = allDataCompanyB.Result.Where(x=>x.ProductType.Code = ProductType.Code)
            var tempD = allDataLastYear.Result.Where(x=>x.ProductType.Code = ProductType.Code)

            // Use data from all tasks to build return object
            return new OutgoingDataRow
            {
                //...
            }
        }
    }
}

Если я удаляю AsNoTracking, код работает нормально, но если я добавляю их, я получаю несколько ошибок, которые не имеют большого смысла для меня.

В одной функции я получаю: System.ArgumentOutOfRangeException: 'Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс '

а в другом я получаю: System.InvalidCastException: «Невозможно привести объект типа« System.Data.ProviderBase.DbConnectionClosedConnecting »к типу« System.Data.SqlClient.SqlInternalConnectionTds ». '

Я попытался установить MultipleActiveResultSets = True, но это не имеет значения.

Я пытался использовать новый DbContext для каждого вызова БД, но я не могу полностью понять, если это хорошая идея или нет.

Что я делаю не так и как это исправить?

...