C# 在测试ASP.NET核心应用程序时,如何使用内存数据库中的EF核心将数据播种到DbContext?
您好,我的应用程序中包含了一些集成测试。在实例化测试类时,我正在使用以下类准备数据库:C# 在测试ASP.NET核心应用程序时,如何使用内存数据库中的EF核心将数据播种到DbContext?,c#,asp.net,asp.net-core,entity-framework-core,integration-testing,C#,Asp.net,Asp.net Core,Entity Framework Core,Integration Testing,您好,我的应用程序中包含了一些集成测试。在实例化测试类时,我正在使用以下类准备数据库: internal static class DatabaseTestPreparation { private const string TestDatabaseName = "TestDatabase"; internal static IServiceCollection ConfigureTestDatabases(this IServiceCollection s
internal static class DatabaseTestPreparation
{
private const string TestDatabaseName = "TestDatabase";
internal static IServiceCollection ConfigureTestDatabases(this IServiceCollection services) =>
services
.PrepareTestDatabaseContext<EventStoreContext>()
.PrepareTestDatabaseContext<GrantContext>();
private static IServiceCollection PrepareTestDatabaseContext<T>(this IServiceCollection services)
where T : DbContext
{
var descriptor = services.SingleOrDefault(service =>
service.ServiceType == typeof(DbContextOptions<T>));
if (!(descriptor is null))
{
services
.Remove(descriptor);
}
services
.AddDbContext<T>(options =>
options.UseInMemoryDatabase(TestDatabaseName))
.Seed<T>();
return services;
}
private static IServiceCollection Seed<T>(this IServiceCollection services) where T : DbContext
{
var serviceProvider = services.BuildServiceProvider();
var dbContext = serviceProvider
.GetService(typeof(T)) as T;
dbContext
?.Database
.EnsureCreated();
return services;
}
}
内部静态类数据库testpreparation
{
私有常量字符串TestDatabaseName=“TestDatabase”;
内部静态IServiceCollection ConfigureTestDatabases(此IServiceCollection服务)=>
服务
.PrepareTestDatabaseContext()
.PrepareTestDatabaseContext();
专用静态IServiceCollection PrepareTestDatabaseContext(此IServiceCollection服务)
其中T:DbContext
{
变量描述符=服务。SingleOrDefault(服务=>
service.ServiceType==typeof(DbContextOptions));
如果(!(描述符为空))
{
服务
.删除(描述符);
}
服务
.AddDbContext(选项=>
选项。UseInMemoryDatabase(TestDatabaseName))
.种子();
返回服务;
}
私有静态IServiceCollection种子(此IServiceCollection服务),其中T:DbContext
{
var serviceProvider=services.BuildServiceProvider();
var dbContext=serviceProvider
.GetService(typeof(T))作为T;
dbContext
数据库
.重新创建();
返回服务;
}
}
我的DbContext类中还包含一些种子逻辑。例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
CreateConstraints(modelBuilder);
SeedInitialData(modelBuilder);
}
private static void CreateConstraints(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PermissionEntity>()
.HasIndex(permission => permission.Code)
.IsUnique();
modelBuilder.Entity<ApplicationEntity>()
.HasIndex(app => app.Name)
.IsUnique();
}
private static void SeedInitialData(ModelBuilder modelBuilder)
{
var application = new ApplicationEntity
{
...
};
modelBuilder.Entity<ApplicationEntity>()
.HasData(application);
var managerRole = new RoleEntity
{
...
};
modelBuilder.Entity<RoleEntity>()
.HasData(managerRole);
var permission = new PermissionEntity
{
...
};
modelBuilder.Entity<PermissionEntity>()
.HasData(permission);
var permissionRoleAssignment = new PermissionRoleAssignmentEntity
{
...
};
modelBuilder.Entity<PermissionRoleAssignmentEntity>()
.HasData(permissionRoleAssignment);
var principal = new PrincipalEntity
{
...
};
modelBuilder.Entity<PrincipalEntity>()
.HasData(principal);
var principalRoleAssignment = new PrincipalRoleAssignmentEntity
{
...
};
modelBuilder.Entity<PrincipalRoleAssignmentEntity>()
.HasData(principalRoleAssignment);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
CreateConstraints(modelBuilder);
SeedInitialData(modelBuilder);
}
私有静态void CreateConstraints(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasIndex(权限=>permission.Code)
.IsUnique();
modelBuilder.Entity()
.HasIndex(app=>app.Name)
.IsUnique();
}
私有静态数据(ModelBuilder ModelBuilder)
{
var应用程序=新应用程序属性
{
...
};
modelBuilder.Entity()
.HasData(应用程序);
var managerRole=新角色属性
{
...
};
modelBuilder.Entity()
.HasData(managerRole);
var权限=新权限实体
{
...
};
modelBuilder.Entity()
.HasData(许可);
var permissionRoleAssignment=新PermissionRoleAssignmentEntity
{
...
};
modelBuilder.Entity()
.HasData(许可证分配);
var principal=新PrincipalEntity
{
...
};
modelBuilder.Entity()
.HasData(校长);
var principalRoleAssignment=新PrincipalRoleAssignmentEntity
{
...
};
modelBuilder.Entity()
.HasData(主要角色分配);
}
以上这些方法确实正确执行,因为我在运行测试时已使用调试器对其进行了检查。问题是,尽管我在DbContext类中编写了seed方法,但当一些测试方法正在运行时,测试方法中使用的DbContext中似乎没有数据。如何在MemoryProvider中正确使用EF Core种子设定数据?我做错了什么?你能在Startup.cs文件中发布相关代码吗,我们最好重现这个问题?请检查Progam类的Main方法,它是否调用seed方法?参考:和。