问题描述
我收到此错误消息:
生成警告“Microsoft.EntityFrameworkCore.Infrastructure.ManyServiceProvidersCreatedWarning”的错误:已创建超过 20 个“IServiceProvider”实例供实体框架内部使用。这通常是由将新的单例服务实例注入每个 DbContext 实例引起的。例如,每次调用 'UseLoggerFactory' 都会传入一个新实例——有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=869049。这可能会导致性能问题,请考虑查看可能需要构建新服务提供程序的“DbContextOptionsBuilder”调用。可以通过将事件 ID 'CoreEventId.ManyServiceProvidersCreatedWarning' 传递给 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法来抑制或记录此异常。
当我一起运行所有单元测试时
设置
private readonly DbContextOptions<ApplicationDbContext> _contextOptions;
private readonly DbContextOptions<ApplicationDbContext> _inMemoryContextOptions;
public TestConstructor()
{
// Test for real database READ
_contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
.UsesqlServer(_connectionString)
.Options;
// Test InMemory CREATE UPDATE DELETE
_inMemoryContextOptions = DbContextOptionsBuilder();
SeedInMemoryTestDb(_inMemoryContextOptions);
}
private static DbContextOptions<ApplicationDbContext> DbContextOptionsBuilder()
{
return new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString(),new InMemoryDatabaseRoot())
.Options;
}
单元测试
[FACT]
public void Test1()
await using var context = new ApplicationDbContext(_contextOptions);
//... Assert.Equal()
[FACT]
public void Test2()
await using var context = new ApplicationDbContext(_inMemoryContextOptions);
//... Assert.Equal()
我在 5 或 6 年级同时进行设置和单元测试。 我想我需要为每个测试重复使用相同的上下文,但我没有做到这一点。
解决方法
[CollectionDefinition("SharedDbContext")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture> { }
public class DatabaseFixture : IDisposable
{
public ApplicationDbContext ApplicationDbContext;
public ApplicationDbContext InMemoryApplicationDbContext;
public DatabaseFixture()
{
// Test for real database READ
var contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseSqlServer(_connectionString)
.Options;
//// Test InMemory CREATE UPDATE DELETE
var inMemoryContextOptions = DbContextOptionsBuilder();
ApplicationDbContext = new ApplicationDbContext(contextOptions);
InMemoryApplicationDbContext = new ApplicationDbContext(inMemoryContextOptions);
SeedInMemoryTestDb(inMemoryContextOptions);
}
}