我使用
.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
类添加扩展方法,可用于检测上下文的已配置提供程序。
对于 SQL Server,它称为
IsSqlServer()
,对于 MySQL - IsMySql()
,对于 SQLite - IsSqlite()
等。对于内存 - 毫不奇怪 IsInMemory()
:)
void AddRecordX(CoreDbContext context)
{
bool contextIsInMemory = context.Database.IsInMemory();
}
唯一棘手的部分是,由于这些是扩展方法,因此项目必须引用相应的包。
另一种方法可能如下,针对您的数据上下文:
private bool IsInMemory()
{
return this.Database.ProviderName == "Microsoft.EntityFrameworkCore.InMemory";
}
这样做的问题是,如果将来 ms 更改提供者名称,它将失败。
与
.Net7
安装以下软件包
dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 7.0.11
然后调用这个方法
Database.IsInMemory()