Мы пытаемся использовать IDesignTimeDbContextFactory
, чтобы мы могли создавать сценарии SQL для всех миграций БД в процессе сборки конвейера.Мы настроили это для нашего контекста, и это, кажется, работает.У нас есть два сторонних контекста БД с Identity Server, для которых требуется дополнительный параметр.Мы ожидаем, что это будет получено, но журналы фактически не говорят нам, используют ли они фабрику времени разработки или нет.Если это так, мы упускаем что-то на фабрике DesignTime, чтобы заставить его работать, но не уверены, чего нам не хватает.
EI 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 ...
НетМетод CreateWebHostBuilder (string []) был найден для типа «AuthServices.API.Program».
Не найден поставщик услуг приложения.
Поиск классов DbContext в проекте ...
Найден DbContext 'FleetContext'.
Found DbContext 'PersistedGrantDbContext'.
Found DbContext 'ConfiguraionDbContext '.
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 (Boocean, открытый интерфейс), Boolean public, BooleanActivator.CreateInstance (тип Type, логическое непубличное, логическое 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 (фабрика Func'1) фабрика Func'1..Internal.DbContextOperations.CreateContext (String contextType)
в Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.ScriptMigration (String fromMigration, String toMigration, Booбережное идемпотентное, String contextType)
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScriptMigration. <> c__DisplayClass0_1. <. ctor> b__0 ()
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.Operation_0..b__0 ()
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (Action action) Невозможно создать объект типа «ConfigurationDbContext».Для различных шаблонов, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728