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方法?参考:和。