我们正在尝试使用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