Ваш код должен (и работает) в целом без проблем и без необходимости в производном классе IDesignTimeDbContextFactory<DbContext>
.
Я загрузил минимальный проект на GitHub, который имитирует ваш дизайн и работает без проблем со следующей командой консоли диспетчера пакетов для создания миграции:
Add-Migration -Project "Infrastructure" -StartupProject "WebApi" -OutputDir Persistence\Migrations "Initial"
Куда go отсюда
Сначала возьмите посмотрите на DbContext Creation во время разработки, чтобы понять, как EF Core ищет ваш DbContext
производный класс.
Затем поместите инструкции Debugger.Launch()
(и Debugger.Break()
) в свой код , чтобы запустить JIT-отладчик при выполнении команды Add-Migration
.
Наконец, выполните пошаговое выполнение кода. Убедитесь, что ваш DependencyInjection.AddInfrastructure()
, ApplicationDbContext.ApplicationDbContext()
, ApplicationDbContext.OnModelCreating()
et c. методы вызываются должным образом. неверно до того, как контекст может быть создан. Это не похоже на конструктор CurrentUserService
, но это может быть конструктор реализующего класса IDateTimeService
или что-то еще, что выполняется во время процесса инициализации. Вы должны быть в состоянии узнать при пошаговом запуске кода.
Обновление: проблема и решение
Как и ожидалось, проблема не связана с EF Core. Метод AddFluentValidation()
вызывает следующее исключение:
System.NotSupportedException: The invoked member is not supported in a dynamic assembly.
at at System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes()
at FluentValidation.AssemblyScanner.FindValidatorsInAssembly(Assembly assembly) in /home/jskinner/code/FluentValidation/src/FluentValidation/AssemblyScanner.cs:49
at FluentValidation.ServiceCollectionExtensions.AddValidatorsFromAssembly(IServiceCollection services, Assembly assembly, ServiceLifetime lifetime) in /home/jskinner/code/FluentValidation/src/FluentValidation.DependencyInjectionExtensions/ServiceCollectionExtensions.cs:48
at FluentValidation.ServiceCollectionExtensions.AddValidatorsFromAssemblies(IServiceCollection services, IEnumerable`1 assemblies, ServiceLifetime lifetime) in /home/jskinner/code/FluentValidation/src/FluentValidation.DependencyInjectionExtensions/ServiceCollectionExtensions.cs:35
at FluentValidation.AspNetCore.FluentValidationMvcExtensions.AddFluentValidation(IMvcBuilder mvcBuilder, Action`1 configurationExpression) in /home/jskinner/code/FluentValidation/src/FluentValidation.AspNetCore/FluentValidationMvcExtensions.cs:72
at WebApi.Startup.ConfigureServices(IServiceCollection services) in E:\Sources\SmartCollaboration\WebApi\Startup.cs:52
at at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.<Invoke>g__Startup|0(IServiceCollection serviceCollection)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.<Build>b__0(IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services)
at at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass12_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
at at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at at Microsoft.Extensions.Hosting.HostBuilder.Build()
Один из способов справиться с этим - просто определить, вызывается ли код из EF Core Tools или нет, и настроить только необходимые службы. , если это так:
public void ConfigureServices(IServiceCollection services)
{
Debugger.Launch(); // <-- Remove this after debugging!
services.AddApplication(Configuration);
services.AddInfrastructure(Configuration);
services.AddScoped<ICurrentUserService, CurrentUserService>();
if (new StackTrace()
.GetFrames()
.Any(f => f?.GetMethod()?.DeclaringType?.Namespace == "Microsoft.EntityFrameworkCore.Tools"))
{
// Called by EF Core design-time tools.
// No need to initialize further.
return;
}
services.AddSwaggerGen(options => {
options.SwaggerDoc("v1", new OpenApiInfo {
Version = "v1",
Title = "SmartCollaboration API"
});
options.AddFluentValidationRules();
});
services.AddHttpContextAccessor();
services.AddControllers().AddFluentValidation(options =>
options.RegisterValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()));
}