Moq asyn c DbSet Setup IDbAsyncQueryProvider - PullRequest
1 голос
/ 26 мая 2020

У меня есть эта установка Moq:

_mockContext.Setup(x => x.CarSections).Returns(new List<CarSection> { _carSection }.ToDbSet());

Которая в основном присваивает List сущности DbContext.CarSections.

Один из методов - asyn c метод. Что-то вроде:

public async Task<CarSection> GetSectionAsync(int sectionId)
    {
        return await _context
            .CarSections
            .FirstOrDefaultAsync(s => s.CarSectionId == sectionId && s.StatusCode == 4);
    }

Когда он проходит через этот метод, я получаю сообщение об ошибке:

Поставщик источника IQueryable не реализует IDbAsyncQueryProvider. Только провайдеры, реализующие IDbAsyncQueryProvider, могут использоваться для асинхронных операций Entity Framework.

Я считаю, что это из-за .ToDbSet (). Уже пробовал с Task.FromResult(new List<CarSection>{ _carSection }, но .Returns ожидает "DbSet", а не "Task".

Есть идеи, как это обойти?

1 Ответ

1 голос
/ 01 июня 2020

Может показаться, что расширение .ToDbSet() (из какого пакета это расширение?) Не настраивает свойство IQueryable<T>.Provider с поставщиком, который реализует IDbAsyncQueryProvider.

Как мне решить эту проблему ?

  • Поищите фиктивную библиотеку, которая сделает это за вас. Я переехал в EFCore довольно скоро go, и поэтому я не уверен, как сейчас выглядит ландшафт для EF, возможно, Усилия ?

  • Если хотите Чтобы развернуть свой собственный документ, проверьте doco из MS , который предоставляет готовую к go реализацию копирования / вставки Moq. Здесь требуется немного строительных лесов, но MS проделала за вас тяжелую работу. В конечном итоге вы создадите свою собственную реализацию IDbAsyncQueryProvider и будете использовать ее в качестве поставщика для своего DbSet<T>.

...