首页 > 解决方案 > 无法创建 MyDbContext 类型的对象

问题描述

我正在MyDbContext使用 Autofac 进行注册,它工作正常,但是当我尝试使用任何 ef 迁移命令(例如,Add-Migration -Name my-migration)时,我收到错误:

无法创建“MyDbContext”类型的对象。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728

如果我注册MyDbContextIServiceCollection错误就会消失。我的 Autofac 配置是:

builder.Register(
    _ =>
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        var conn = configuration.GetConnectionString(connName);
        var dbConnection = new NpgsqlConnection(conn);
        var password = configuration.GetPassword(connName);

        dbConnection.ProvidePasswordCallback =
            (host, port, database, username) => password;
        optionsBuilder.UseNpgsql(dbConnection);

        return new MyDbContext(optionsBuilder.Options);
    })
    .AsSelf()
    .InstancePerLifetimeScope();

根据微软的文档:

这些工具首先尝试通过调用 Program.CreateHostBuilder()、调用 Build() 来获取服务提供者,然后访问 Services 属性。

我调试了我的应用程序,并且能够MyDbContext通过IHost调用IHostBuilder.Build(). 我错过了什么,我需要做其他事情吗?

提前致谢。

标签: c#autofacentity-framework-migrations

解决方案


您是否尝试过这里提到的解决方案。

builder.Register(componentContext =>
    {
        var serviceProvider = componentContext.Resolve<IServiceProvider>();
        var configuration = componentContext.Resolve<IConfiguration>();
        var dbContextOptions = new DbContextOptions<TContext>(new Dictionary<Type, IDbContextOptionsExtension>());
        var optionsBuilder = new DbContextOptionsBuilder<TContext>(dbContextOptions)
            .UseApplicationServiceProvider(serviceProvider)
            .UseSqlServer(configuration.GetConnectionString("MyConnectionString"),
                serverOptions => serverOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null));

        return optionsBuilder.Options;
    }).As<DbContextOptions<TContext>>()
    .InstancePerLifetimeScope();

builder.Register(context => context.Resolve<DbContextOptions<TContext>>())
    .As<DbContextOptions>()
    .InstancePerLifetimeScope();

builder.RegisterType<TContext>()
    .AsSelf()
    .InstancePerLifetimeScope();

推荐阅读