C# EF Core-连接字符串不能为null

C# EF Core-连接字符串不能为null,c#,entity-framework-core,asp.net-core-2.1,ef-core-2.1,C#,Entity Framework Core,Asp.net Core 2.1,Ef Core 2.1,我正在使用ASP.Net Core 2.1和EF Core 2.1 从PMC运行任何迁移时,我得到以下错误 值不能为null。参数名称:connectionString 这就是我的上下文类的样子 public class MyAppContextFactory : IDesignTimeDbContextFactory<MyAppContext> { private readonly string _dbConnection; public MyAppContext

我正在使用
ASP.Net Core 2.1
EF Core 2.1

从PMC运行任何迁移时,我得到以下错误

值不能为null。参数名称:connectionString

这就是我的上下文类的样子

public class MyAppContextFactory : IDesignTimeDbContextFactory<MyAppContext>
{
    private readonly string _dbConnection;

    public MyAppContextFactory()
    {

    }
    public MyAppContextFactory(string dbConnection)
        : this()
    {
        _dbConnection = dbConnection;

    }

    public MyAppContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyAppContext>();
        optionsBuilder.UseSqlServer(_dbConnection, opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(15).TotalSeconds));
        return new MyAppContext(optionsBuilder.Options);
    }


}
公共类MyAppContextFactory:IDesignTimeDbContextFactory
{
私有只读字符串_dbConnection;
公共MyAppContextFactory()
{
}
公共MyAppContextFactory(字符串dbConnection)
:此()
{
_dbConnection=dbConnection;
}
公共MyAppContext CreateDbContext(字符串[]args)
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(_dbConnection,opts=>opts.CommandTimeout((int)TimeSpan.FromMinutes(15.TotalSeconds));
返回新的MyAppContext(optionsBuilder.Options);
}
}
我的连接字符串存在于appsettings.json的API层中&作为良好的实践,我不应该在API/UI层中添加任何对EF的引用

在这种分层架构中,如何根据环境设置连接字符串


谢谢。

EF实际上从2.0开始启动应用程序生成迁移。您需要将DesignTimeDbContextFactory添加到将查询此用例的连接字符串的项目中,例如:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<StorageContext>
    {
        public StorageContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false)
                .AddJsonFile("appsettings.Development.json", optional: true)
                .Build();

            var builder = new DbContextOptionsBuilder<StorageContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseSqlServer(connectionString);

            Console.WriteLine($"Running DesignTime DB context. ({connectionString})");

            return new StorageContext(builder.Options);
        }
    }
公共类DesignTimeDbContextFactory:IDesignTimeDbContextFactory
{
public-StorageContext-CreateDbContext(字符串[]args)
{
IConfigurationRoot配置=新配置生成器()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false)
.AddJsonFile(“appsettings.Development.json”,可选:true)
.Build();
var builder=new DbContextOptionsBuilder();
var connectionString=configuration.GetConnectionString(“DefaultConnection”);
使用SQLServer(connectionString);
WriteLine($“正在运行设计时数据库上下文({connectionString})”);
返回新的StorageContext(builder.Options);
}
}

EF实际上从2.0开始启动应用程序生成迁移。您需要将DesignTimeDbContextFactory添加到将查询此用例的连接字符串的项目中,例如:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<StorageContext>
    {
        public StorageContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false)
                .AddJsonFile("appsettings.Development.json", optional: true)
                .Build();

            var builder = new DbContextOptionsBuilder<StorageContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseSqlServer(connectionString);

            Console.WriteLine($"Running DesignTime DB context. ({connectionString})");

            return new StorageContext(builder.Options);
        }
    }
公共类DesignTimeDbContextFactory:IDesignTimeDbContextFactory
{
public-StorageContext-CreateDbContext(字符串[]args)
{
IConfigurationRoot配置=新配置生成器()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false)
.AddJsonFile(“appsettings.Development.json”,可选:true)
.Build();
var builder=new DbContextOptionsBuilder();
var connectionString=configuration.GetConnectionString(“DefaultConnection”);
使用SQLServer(connectionString);
WriteLine($“正在运行设计时数据库上下文({connectionString})”);
返回新的StorageContext(builder.Options);
}
}

正如我尝试使用您的代码段一样,但是获取错误“ConfigurationBuilder”不包含“SetBasePath”的定义,并且找不到接受“ConfigurationBuilder”类型的第一个参数的可访问扩展方法“SetBasePath”(您是否缺少using指令或程序集引用?)这来自
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
,不确定确切是哪一个。基本上,您可以更改我的实现,以获得对您最有利的结果,其思想是将连接注入DbContext以生成迁移。您从何处阅读以及如何阅读取决于您。正如我尝试使用您的代码段一样,但是获取错误“ConfigurationBuilder”不包含“SetBasePath”的定义,并且找不到接受“ConfigurationBuilder”类型的第一个参数的可访问扩展方法“SetBasePath”(是否缺少using指令或程序集引用?)这来自
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
,不确定具体是哪一个。基本上,您可以更改我的实现,以获得最适合您的实现,其思想是将连接注入到DbContext中以生成迁移。从何处读取它,以及怎么办取决于你。