kas*_*rhj 4 entity-framework entity-framework-core
我正在尝试在 .NET 标准 2.0类库中使用迁移 EFCore2.0,到目前为止我有类似的东西
public class SomeContextFactory : IDesignTimeDbContextFactory<SomeContext>
{
private Configuration _configuration;
public SomeContextFactory(Configuration configuration)
{
_configuration = configuration;
}
public SomeContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<SomeContext>();
optionsBuilder.UseSqlServer(_configuration.ConnectionString);
return new SomeContext(optionsBuilder.Options);
}
}
public class SomeContext : DbContext
{
public DbSet<SomeDbModel> Some { get; set; }
public SomeContext(DbContextOptions<SomeContext> options) : base(options)
{
}
}
Run Code Online (Sandbox Code Playgroud)
关键是连接字符串因环境(dev、test、prod)而异,迁移应该在Configuration.
如何请示迁移注入Configuration到SomeContextFactory?
根据设计,IDesignTimeDbContextFactory不支持使用 DI。实现这一目标的一种方法是:
public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
{
public AppDbContext CreateDbContext(params string[] args)
{
var options = new DbContextOptionsBuilder<AppDbContext>();
var config = GetAppConfiguration();
options.UseSqlServer(config.GetConnectionString("DesignTimeAppDbConnection"));
return new AppDbContext(options.Options);
}
IConfiguration GetAppConfiguration()
{
var environmentName =
Environment.GetEnvironmentVariable(
"ASPNETCORE_ENVIRONMENT");
var dir = Directory.GetParent(AppContext.BaseDirectory);
if(EnvironmentName.Development.Equals(environmentName,
StringComparison.OrdinalIgnoreCase))
{
var depth = 0;
do
dir = dir.Parent;
while (++depth < 5 && dir.Name != "bin");
dir = dir.Parent;
}
var path = dir.FullName;
var builder = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{environmentName}.json", true)
.AddEnvironmentVariables();
return builder.Build();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |