Я пытаюсь добавить «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 для каждого вызова БД, но я не могу полностью понять, если это хорошая идея или нет.
Что я делаю не так и как это исправить?