如何测试 DbContext 是否在内存中?

How do I test whether a DbContext is in memory?

我使用 .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 关联?

每个 EF Core 数据库提供程序都将扩展方法添加到 DatabaseFacade class,可用于检测为上下文配置的提供程序。

对于 SQL 服务器,它被称为 IsSqlServer(),对于 MySQL - IsMySql(),对于 SQLite - IsSqlite() 等等。在记忆中 - 不足为奇 IsInMemory() :)

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

唯一棘手的是,由于这些是扩展方法,项目必须引用相应的包。