我有一个DbContext,我正在使用它创建设计时迁移,但是遇到了麻烦。
我有一个“迁移”类(如下),该类实际上是根据this answer的Designtime工厂。
没有错误,它会生成。
我已将此类放在Web项目中,并且上下文在另一个项目库中。
我使用以下命令运行迁移:
dotnet ef migrations add INITIAL --context TENANTSContext -s ../Jobsledger.API
一旦运行它将生成,然后显示以下内容:
Build started...
Build succeeded.
An error occurred while accessing the Microsoft.Extensions.Hosting services. Continuing without the application service provider. Error: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.IDatabaseCreationService Lifetime: Scoped ImplementationType: JobsLedger.DATABASE.CREATION.SERVICE.DatabaseCreationService': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.INewDatabaseService Lifetime: Scoped ImplementationType: JobsLedger.DATABASE.CREATION.SERVICE.NewDatabaseService': Unable to resolve service for type 'JobsLedger.TENANTS.Repositories.Interfaces.IAccountTENANTSRepository' while attempting to activate 'JobsLedger.DATABASE.CREATION.SERVICE.NewDatabaseService'.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.ITenantAndAccountInitialisations Lifetime: Scoped ImplementationType: JobsLedger.DATABASE.CREATION.SERVICE.TenantAndAccountInitialisations': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.TENANTSContext Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.TENANTSContext': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.DATAContext Lifetime: Scoped ImplementationType: JobsLedger.DATA.DATAContext': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IBrandDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.BrandDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IClientDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.ClientDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ICounterDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.CounterDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IJobDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.JobDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ILoggingDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.LoggingDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.INoteDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.NoteDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.INoteTypeDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.NoteTypeDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IStateDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.StateDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IStatusDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.StatusDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ISuburbDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.SuburbDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ITypeDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.TypeDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IVisitDATARepository Lifetime: Scoped ImplementationType: JobsLedger.DATA.Repositories.VisitDATARepository': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.ITenantTENANTSRepository Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.Repositories.TenantTENANTSRepository': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.ITenantTENANTSRepository Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.Repositories.TenantTENANTSRepository': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.ICounterTENANTSRepository Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.Repositories.CounterTENANTSRepository': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.ISuburbTENANTSRepository Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.Repositories.SuburbTENANTSRepository': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.IStateTENANTSRepository Lifetime: Scoped ImplementationType: JobsLedger.TENANTS.Repositories.StateTENANTSRepository': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.API.CONTROLLER.SERVICES.API.App.ClientService.Interfaces.IClientServices Lifetime: Scoped ImplementationType: JobsLedger.API.CONTROLLER.SERVICES.API.App.ClientService.ClientServices': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.API.CONTROLLER.SERVICES.API.App.JobService.Interfaces.IJobServices Lifetime: Scoped ImplementationType: JobsLedger.API.CONTROLLER.SERVICES.API.App.JobService.JobServices': No constructor for type 'JobsLedger.DATA.DATAContext' can be instantiated using services from the service container and default values.) (Error while validating the service descriptor 'ServiceType: JobsLedger.API.CONTROLLER.SERVICES.Authorisation.Interfaces.IAccountService Lifetime: Scoped ImplementationType: JobsLedger.API.CONTROLLER.SERVICES.Authorisation.AccountService': Unable to resolve service for type 'JobsLedger.TENANTS.Repositories.Interfaces.IAccountTENANTSRepository' while attempting to activate 'JobsLedger.API.CONTROLLER.SERVICES.Authorisation.AccountService'.) (Error while validating the service descriptor 'ServiceType: JobsLedger.API.CONTROLLER.SERVICES.Common.Interfaces.IAddressDropdownServices Lifetime: Scoped ImplementationType: JobsLedger.API.CONTROLLER.SERVICES.Common.AddressDropdownServices': Unable to resolve service for type 'JobsLedger.INTERFACES.IUserSession' while attempting to activate 'JobsLedger.API.CONTROLLER.SERVICES.Common.AddressDropdownServices'.) (Error while validating the service descriptor 'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.ITenantAndAccountInitialisations Lifetime: Scoped ImplementationType: JobsLedger.DATABASE.CREATION.SERVICE.TenantAndAccountInitialisations': No constructor for type 'JobsLedger.TENANTS.TENANTSContext' can be instantiated using services from the service container and default values.)
System.MissingMethodException: No parameterless constructor defined for type 'JobsLedger.API.DesignTimeTENANTSContextFactory'.
at System.RuntimeType.CreateInstanceDefaultCtorSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, Boolean wrapExceptions)
at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
at System.Activator.CreateInstance(Type type)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContextFromFactory(Type factory, Type contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_2.<FindContextTypes>b__9()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
No parameterless constructor defined for type 'JobsLedger.API.DesignTimeTENANTSContextFactory'.
下面将再次详细说明该错误的第一部分,并说无法解决所有范围的服务-这些本质上是我启动时DI的所有服务的列表:
访问Microsoft.Extensions.Hosting时发生错误 服务。没有应用程序服务提供商就可以继续。错误: 某些服务无法构建(验证时出错 服务描述符'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.IDatabaseCreationService 生命周期:范围实施类型: JobsLedger.DATABASE.CREATION.SERVICE.DatabaseCreationService':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.INewDatabaseService 生命周期:范围实施类型: JobsLedger.DATABASE.CREATION.SERVICE.NewDatabaseService':无法执行 解决服务类型 'JobsLedger.TENANTS.Repositories.Interfaces.IAccountTENANTSRepository' 尝试激活时 'JobsLedger.DATABASE.CREATION.SERVICE.NewDatabaseService'。)(错误 在验证服务描述符'ServiceType: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.ITenantAndAccountInitialisations 生命周期:范围实施类型: JobsLedger.DATABASE.CREATION.SERVICE.TenantAndAccountInitialisations': 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数不能为 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.TENANTS.TENANTSContext生存期:范围实现类型: JobsLedger.TENANTS.TENANTSContext':没有类型的构造函数 可以使用服务实例化“ JobsLedger.TENANTS.TENANTSContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.DATAContext生存期:范围内的实现类型: JobsLedger.DATA.DATAContext':没有类型的构造函数 可以使用来自以下位置的服务实例化“ JobsLedger.DATA.DATAContext” 服务容器和默认值。)(验证 服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IBrandDATARepository生命周期: 范围实施类型: JobsLedger.DATA.Repositories.BrandDATARepository':没有针对的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IClientDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.ClientDATARepository':没有针对的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ICounterDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.CounterDATARepository':无构造函数 类型'JobsLedger.DATA.DATAContext'的实例可以使用 服务容器中的服务和默认值。)(错误发生在 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IJobDATARepository生存期: 范围实施类型: JobsLedger.DATA.Repositories.JobDATARepository':没有用于的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ILoggingDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.LoggingDATARepository':无构造函数 类型'JobsLedger.DATA.DATAContext'的实例可以使用 服务容器中的服务和默认值。)(错误发生在 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.INoteDATARepository生存期: 范围实施类型: JobsLedger.DATA.Repositories.NoteDATARepository':没有用于的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.INoteTypeDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.NoteTypeDATARepository':无构造函数 类型'JobsLedger.DATA.DATAContext'的实例可以使用 服务容器中的服务和默认值。)(错误发生在 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IStateDATARepository生存期: 范围实施类型: JobsLedger.DATA.Repositories.StateDATARepository':没有用于的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IStatusDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.StatusDATARepository':没有针对的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ISuburbDATARepository 生命周期:范围实施类型: JobsLedger.DATA.Repositories.SuburbDATARepository':没有用于的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.ITypeDATARepository生存期: 范围实施类型: JobsLedger.DATA.Repositories.TypeDATARepository':没有用于的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.DATA.Repositories.Interfaces.IVisitDATARepository生存期: 范围实施类型: JobsLedger.DATA.Repositories.VisitDATARepository':没有针对的构造函数 可以使用服务实例化类型“ JobsLedger.DATA.DATAContext” (从服务容器和默认值)。 验证服务描述符'ServiceType: JobsLedger.TENANTS.Repositories.Interfaces.ITenantTENANTSRepository 生命周期:范围实施类型: JobsLedger.TENANTS.Repositories.TenantTENANTSRepository':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.TENANTS.Repositories.Interfaces.ITenantTENANTSRepository 生命周期:范围实施类型: JobsLedger.TENANTS.Repositories.TenantTENANTSRepository':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.TENANTS.Repositories.Interfaces.ICounterTENANTSRepository 生命周期:范围实施类型: JobsLedger.TENANTS.Repositories.CounterTENANTSRepository':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.TENANTS.Repositories.Interfaces.ISuburbTENANTSRepository 生命周期:范围实施类型: JobsLedger.TENANTS.Repositories.SuburbTENANTSRepository':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.TENANTS.Repositories.Interfaces.IStateTENANTSRepository 生命周期:范围实施类型: JobsLedger.TENANTS.Repositories.StateTENANTSRepository':否 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数可以是 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.API.CONTROLLER.SERVICES.API.App.ClientService.Interfaces.IClientServices 生命周期:范围实施类型: JobsLedger.API.CONTROLLER.SERVICES.API.App.ClientService.ClientServices': 类型'JobsLedger.DATA.DATAContext'的构造函数不能为 使用服务容器中的服务实例化并默认 值。)(验证服务描述符'ServiceType时出错: JobsLedger.API.CONTROLLER.SERVICES.API.App.JobService.Interfaces.IJobServices 生命周期:范围实施类型: JobsLedger.API.CONTROLLER.SERVICES.API.App.JobService.JobServices':否 可以实例化类型“ JobsLedger.DATA.DATAContext”的构造函数 使用服务容器中的服务和默认值。)(错误 在验证服务描述符'ServiceType: JobsLedger.API.CONTROLLER.SERVICES.Authorisation.Interfaces.IAccountService 生命周期:范围实施类型: JobsLedger.API.CONTROLLER.SERVICES.Authorisation.AccountService': 无法解析服务类型 'JobsLedger.TENANTS.Repositories.Interfaces.IAccountTENANTSRepository' 尝试激活时 'JobsLedger.API.CONTROLLER.SERVICES.Authorisation.AccountService'。) (验证服务描述符'ServiceType时出错: JobsLedger.API.CONTROLLER.SERVICES.Common.Interfaces.IAddressDropdownServices 生命周期:范围实施类型: JobsLedger.API.CONTROLLER.SERVICES.Common.AddressDropdownServices': 无法解析服务类型 尝试激活时出现“ JobsLedger.INTERFACES.IUserSession” 'JobsLedger.API.CONTROLLER.SERVICES.Common.AddressDropdownServices'。) (验证服务描述符'ServiceType时出错: JobsLedger.DATABASE.CREATION.SERVICE.Interfaces.ITenantAndAccountInitialisations 生命周期:范围实施类型: JobsLedger.DATABASE.CREATION.SERVICE.TenantAndAccountInitialisations': 类型'JobsLedger.TENANTS.TENANTSContext'的构造函数不能为 使用服务容器中的服务实例化并默认 值。)
这是我的Migration.cs类,它是设计时工厂:
public DesignTimeTENANTSContextFactory(IDbConnectionString connectionString)
{
_connectionString = connectionString;
}
public TENANTSContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var builder = new DbContextOptionsBuilder<TENANTSContext>();
var connectionString = configuration.GetConnectionString("CatalogConnection");
builder.UseSqlServer(connectionString);
return new TENANTSContext(builder.Options);
}
}
它在TENANTSContext中使用了无参数构造函数,详细信息如下:
public class TENANTSContext : DbContext
{
private readonly HttpContext _httpContext;
// Constructors..
public TENANTSContext(DbContextOptions<TENANTSContext> options)
: base(options)
{ }
public TENANTSContext(DbContextOptions<TENANTSContext> options, HttpContext httpContext) : base(options)
{
_httpContext = httpContext;
}
public DbSet<Tenant> Tenants { get; set; }
......
那我为什么会收到上述错误。我也是following this documentation,这表示它不使用应用程序服务,而是使用了我正在使用的designTimeFactory,所以为什么要抱怨所有不能被实例化的服务等。
此外,它的意思是:
No parameterless constructor defined for type 'JobsLedger.API.DesignTimeTENANTSContextFactory'.
基本上有什么问题,我该如何纠正?