我在 NET Core2.0应用程序中有以下类。
// required when local database does not exist or was deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
public AppContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
return new AppContext(builder.Options);
}
}
当数据库不存在并且必须在运行 更新资料库时创建时,这在 Core2.0迁移中是必需的。
升级到 ASP.NET Core 2.0后无法创建迁移
我不希望 ConnectionString 出现在两个地方(这里和 appsetings.json 中) ,而只出现在. json 中 所以我试图替换
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
和
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
但是没有用,我得到的是空值。
更新1:
只要注意明确地添加。Json 在 Core 2中不是必需的,所以问题不在于文件。
Https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
更新2:
此外,我已经在使用 Configuration 将 ConnectionString 从.json 发送到 Context:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
但是我不能使用这个对于 ToDoContextFactory,因为它没有配置,而且 ToDoContextFactory是由迁移使用的,所以应用程序根本不运行。
解决方案: 根据@JRB 的回答,我把它设计成这样:
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}