Как отключить активную загрузку при использовании InMemoryDatabase - PullRequest
0 голосов
/ 10 октября 2018

У меня есть EF.Core 2.1 DataContext, для которого я не включаю отложенную загрузку.

Моя конфигурация выглядит следующим образом:

services.AddDbContext<DataContext>(options =>  
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Мои тесты используют один и тот же DataContext, но используют разныепараметры, например, так:

options.UseInMemoryDatabase(databaseName: "ProjectSpecs")

Все это работает нормально, за исключением того, что мой в памяти DataContext стремится загрузить все.

Если я спрашиваю у сущности, загружает ли она все связанные объекты.

Это означает, что если я действительно хочу загрузить связанное свойство и забыть сделать это, мои тесты проходят как связанныесущность загружена.Но в реальном приложении происходит сбой из-за того, что .include забыто.

Могу ли я заставить DataContext в памяти вести себя так же, как реальное?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Один маленький, но важный момент.Использование Include () - eager loading.Получение EF для загрузки сущностей по мере необходимости lazy loading.Вы хотите отключить отложенную загрузку, чтобы можно было протестировать готовую загрузку - правильное использование Include ().

По умолчанию отложенная загрузка отключена . Чтобы включить ее в тестовом коде,добавьте UseLazyLoadingProxies () в ваши DbContextOptions так же, как и для кода приложения.За исключением того, что, вероятно, лучше этого не делать, именно поэтому вы можете проверить, правильно ли вы загружаетесь.

Проблема здесь не в том, что вы используете отложенную загрузку, а в том, что вы используете тот же DbContext длянастройте свои тестовые данные так, как вы это делаетеТаким образом, данные остаются в DbContext и вообще не загружаются из базы данных в памяти.

Просто убедитесь, что вы используете другой DbContext для настройки и для тестов.Однако оно должно иметь одинаковое имя базы данных.Фактически вы можете использовать точно такой же объект параметров.

0 голосов
/ 02 февраля 2019

Я страдал от той же проблемы, и после прочтения множества статей на эту тему, я пришел к выводу, что проблема действительно в том, что тестируемый код читает из ChangeTracker, где тестовый код уже собралграф объектов.Вооружившись этими знаниями, я взял свой DbContext и переопределил метод SaveChanges, как показано ниже.

public override int SaveChanges()
{
    var affectedRows = base.SaveChanges();

    if (Database.ProviderName == "Microsoft.EntityFrameworkCore.InMemory")
    {
        ChangeTracker.Entries()
            .Where(e => e.Entity != null)
            .ToList()
            .ForEach(e => e.State = EntityState.Detached);
    }

    return affectedRows;
}

Отключая каждый объект в ChangeTracker, он заставляет тестируемый код возвращаться в базу данных вместовытащить существующий граф объектов из ChangeTracker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...