IDesignTimeDbContextFactory无法按预期运行

时间:2019-03-05 15:25:08

标签: c# .net entity-framework entity-framework-core

我们正在尝试使用IDesignTimeDbContextFactory,以便我们可以在管道的构建过程中为数据库的所有迁移构建SQL脚本。我们已经根据自己的情况进行了设置,而且似乎正在奏效。我们有两个来自Identity Server的第三方数据库上下文,它们需要一个额外的参数。我们希望可以将其获取,但是日志实际上不会告诉我们它们是否在使用设计时工厂。如果是这样,那么我们将在DesignTime Factory中丢失某些东西以使其正常工作,但不能确定我们丢失了什么。

正在运行EF CLI
dotnet ef migrations script -c ConfigurationDbContext -i -p AuthServices.EF.csproj -s ../AuthServices.API/AuthServices.API.csproj -o Migrations/ConfigurationDb/FullMigrations.sql --verbose

ConfigurationDbContextFactory

public class ConfigurationDbContextFactory : IDesignTimeDbContextFactory<ConfigurationDbContext>
{
    public ConfigurationDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ConfigurationDbContext>();
        optionsBuilder.UseSqlServer(Constants.DesignTimeConnectionString,
            sql =>
            {
                sql.MigrationsAssembly(Constants.TargetAssembly);
                sql.MigrationsHistoryTable(Core.Constants.DatabaseTableMigrationHistories,
                    Constants.Schemas.Configuration);
            });

        var configurationStoreOptions = new ConfigurationStoreOptions
            {DefaultSchema = Constants.Schemas.Configuration};

        return new ConfigurationDbContext(optionsBuilder.Options, configurationStoreOptions);
    }
}

来自我们的常量文件 public static string DesignTimeConnectionString = "Server=(localdb)\\mssqllocaldb;Database=FAC-Auth-Services-EF-Db;Trusted_Connection=True;";
public const string DatabaseTableMigrationHistories = "__MigrationHistories";
public const string Configuration = "Configuration";

我们已经设置了Program.cs文件,以便在尝试创建迁移时不会被拾取。

Program.cs

internal static IWebHostBuilder ConfigureWebHostBuilder(string[] args)
    {
        var webHostBuilder = WebHost.CreateDefaultBuilder(args);
        webHostBuilder.AddJsonConfiguration(additionalConfigs: KeyVaultConfiguration.Setup);
        webHostBuilder.AddSeriLogging(additionalConfigs: ApplicationInsightLogging.Setup);
        return webHostBuilder.UseStartup<Startup>();
    }

日志

  

正在查找DbContext类...
  正在查找IDesignTimeDbContextFactory实现...
  正在寻找应用服务提供商...
  正在查找IWebHost访问器...
  在类型'AuthServices.API.Program'上找不到CreateWebHostBuilder(string [])方法。
  找不到应用程序服务提供商。
  在项目中找到DbContext类...
  找到了DbContext'FleetContext'。
  找到了DbContext'PersistedGrantDbContext'。
  找到DbContext'ConfigurationDbContext'。
  Microsoft.EntityFrameworkCore.Design.OperationException:无法创建类型为“ ConfigurationDbContext”的对象。有关设计时支持的不同模式,请参见https://go.microsoft.com/fwlink/?linkid=851728 --->
  System.MissingMethodException:没有为此对象定义无参数的构造函数。    在System.RuntimeTypeHandle.CreateInstance处(RuntimeType类型,布尔publicOnly,布尔wrapExceptions,布尔&canBeCached,RuntimeMethodHandleInternal和ctor)
  在System.RuntimeType.CreateInstanceSlow处(布尔publicOnly,布尔wrapExceptions,布尔skipCheckThis,布尔fillCache)
  在System.Activator.CreateInstance(类型类型,布尔值非公共,布尔值wrapExceptions)
  在Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations。<> c__DisplayClass12_3.b__13()
  ---内部异常堆栈跟踪的结尾---
  在Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations。<> c__DisplayClass12_3.b__13()
  在Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(功能1工厂)
  在Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
  在Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.ScriptMigration(String fromMigration,String toMigration,布尔幂等,String contextType)
  在Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScriptMigration。<> c__DisplayClass0_1。<。ctor> b__0()
  在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase中。<> c__DisplayClass3_0`1.b__0()
  在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)无法创建类型为ConfigurationDbContext的对象。   有关设计时支持的不同模式,请参见https://go.microsoft.com/fwlink/?linkid=851728

0 个答案:

没有答案