Dotnet Core 5.0-设计时迁移时遇到问题

时间:2020-11-09 12:40:52

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

我有一个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'.

基本上有什么问题,我该如何纠正?

0 个答案:

没有答案