Как проверить, находится ли DbContext в памяти? - PullRequest
0 голосов
/ 17 октября 2018

Я использую .Net Core 2.1. Мое приложение использует Entity Framework Core, с контекстом CoreDbContext, который происходит от DbContext.

Для модульного тестирования я использую в памяти версию CoreDbContext, в результатев этом коде в моем Startup.cs:

if (useInMemoryDatabase)
{
    services.AddDbContext<CoreDbContext>(options => 
           options.UseInMemoryDatabase("dbname"));
}
else
{
    services
      .AddDbContext<CoreDbContext>(options => 
           options.UseSqlServer(DefaultDbConnectionString));
}

У меня также есть методы, которые обращаются к базе данных через контекст.Иногда им нужно знать, находится ли контекст в памяти или нет, потому что контекст в памяти ведет себя не так, как обычно:

void AddRecordX(CoreDbContext context)
{
    bool contextIsInMemory = .....;

}

Как я могу проверить, находится ли контекст в памяти или связан с реальнымSQL Server database

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Каждый поставщик базы данных EF Core добавляет метод расширения к классу DatabaseFacade, который можно использовать для определения настроенного поставщика для контекста.

Для SQL Server он называется IsSqlServer(), для MySQL - IsMySql(), для SQLite - IsSqlite() и т. д. И для памяти - не удивительно IsInMemory():)

void AddRecordX(CoreDbContext context)
{
    bool contextIsInMemory = context.Database.IsInMemory();
}

Единственная сложность заключается в том, что, поскольку это методы расширения, проект должен иметь ссылку насоответствующая упаковка.

0 голосов
/ 17 октября 2018

Почему в своих модульных тестах вы используете базу данных напрямую?Используйте некоторую фиктивную библиотеку, чтобы «заменить» базу данных фиктивной.Для этого есть много хороших уроков.

...