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

问题描述 投票:0回答:3

我使用

.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
相关联?

entity-framework entity-framework-core entity-framework-core-2.1
3个回答
20
投票

每个 EF Core 数据库提供程序都会向

DatabaseFacade
类添加扩展方法,可用于检测上下文的已配置提供程序。

对于 SQL Server,它称为

IsSqlServer()
,对于 MySQL -
IsMySql()
,对于 SQLite -
IsSqlite()
等。对于内存 - 毫不奇怪
IsInMemory()
:)

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

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


0
投票

另一种方法可能如下,针对您的数据上下文:

private bool IsInMemory()
{
   return this.Database.ProviderName == "Microsoft.EntityFrameworkCore.InMemory";
}

这样做的问题是,如果将来 ms 更改提供者名称,它将失败。


0
投票

.Net7

安装以下软件包

dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 7.0.11

然后调用这个方法

Database.IsInMemory()

内存数据库门面扩展

© www.soinside.com 2019 - 2024. All rights reserved.