构造函数注入 IDesignTimeDbContextFactory

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.

如何请示迁移注入ConfigurationSomeContextFactory

Shi*_*mmy 6

根据设计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 次

最近记录:

6 年,8 月 前