我将ASP.Net Core 2.1
与EF Core 2.1
一起使用
从PMC运行任何迁移时,出现以下错误
值不能为null。参数名称:connectionString
这是我的Context类的样子
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);
}
}
我的连接字符串出现在appsettings.json的API层中,按照惯例,我不应该在API / UI层中添加对EF的任何引用。
如何在这种分层体系结构中根据环境设置连接字符串?
谢谢。
答案 0 :(得分:0)
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);
}
}