Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用我的类库中的代码运行迁移_C#_Asp.net Core_.net Core - Fatal编程技术网

C# 使用我的类库中的代码运行迁移

C# 使用我的类库中的代码运行迁移,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我有一个类库,稍后将作为nuget包打包 要使用我的nuget包,我在我的库中的一个名为Injections.cs的文件中有一个方法,您可以将它添加到startup.cs文件中 看起来是这样的: public static class Injections { public static IServiceCollection AddServiceAndRoleSecurity(this IServiceCollection services) { services

我有一个类库,稍后将作为nuget包打包

要使用我的nuget包,我在我的库中的一个名为Injections.cs的文件中有一个方法,您可以将它添加到startup.cs文件中

看起来是这样的:

public static class Injections
{
    public static IServiceCollection AddServiceAndRoleSecurity(this IServiceCollection services)
    {
        services.AddTransient<ISecurityService, SecurityService>();
        services.AddTransient<IDatabaseContextFactory, DatabaseContextFactory>();
        services.AddTransient<ISecurityRepository, SecurityRepository>();

        services.AddDbContext<IDatabaseContext, DatabaseContext>(options =>
            options.UseSqlServer(@""",
            x => x.MigrationsAssembly(typeof(DatabaseContext).Assembly.FullName)));

        services.AddMemoryCache();

        return services;
    }
}
但是,对于有Startup.cs文件的问题,通常可以找到这种类型的解决方案,但在我的例子中,我没有任何Startup.cs,因为它是一个类库


那么,我如何从类库运行迁移呢?

在单独的应用程序中创建数据库迁移,而不是在具有业务逻辑的应用程序中创建数据库迁移。部署应用程序时,此迁移应用程序可以作为部署管道的一部分运行


我不会在启动应用程序时加载诸如数据库迁移之类的内容。

您真的希望库在您的数据库上运行迁移吗?我不确定是否希望看到这种行为?好的,但是其他层调用这个类库,对吗?另一层有一个Startup.cs,对吗?那有什么问题?你为什么不想看到这种行为?
public static IApplicationBuilder CreateDatabase(this IApplicationBuilder app, IServiceScopeFactory scopeFactory)
{
    using (var scope = scopeFactory.CreateScope())
    {
        var db = scope.ServiceProvider.GetRequiredService<IDatabaseContext>();

        var migrations = db.DatabaseAccessor.GetPendingMigrations();

        if (migrations.Any())
            db.DatabaseAccessor.Migrate();
    }

    return app;
}