2017-11-24 6 views
4

マイグレーションと一緒にDB接続文字列を処理するのに問題があります。 私は2つのプロジェクトがあります。Entity Frameworkコアマイグレーション - 接続文字列

  • ドメイン
  • アプリケーション

DbContextドメインプロジェクトであるので、これは私がに対してマイグレーションを実行するプロジェクトです。 移行の概念は私のDbContextOnConfiguringを実装し、その中で例えば、データベース・プロバイダーを指定するには、私を強制:私の問題は、私は明白な理由のために、ハードコードされた接続文字列を使用しないということです

protected override void OnConfiguring(DbContextOptionsBuilder builder) 
{ 
    builder.UseSqlServer("<connection string>"); 
} 

、およびconfigファイルはアプリケーションプロジェクト内にあるので、ConfigManagerを使用してconfigファイルから読み取ることはできません。

答えて

0

同じ問題があり、解決策があります。 :)

実装する必要がありますIDbContextFactory<TContext> これを実行すると、appsettings.jsonから接続文字列を読み取ることができます。 OnConfigure()を上書きすることは時代遅れですので、エラーなしでAdd-Migrationを使用することもできます。

サンプル実装:我々はそれを使用する方法

public class DomainContextFactory : IDbContextFactory<DomainContext> 
{ 
    public string BasePath { get; protected set; } 

    public DomainContext Create() 
    { 
     var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 

     var basePath = AppContext.BaseDirectory; 

     return Create(basePath, environmentName); 
    } 

    public DomainContext Create(DbContextFactoryOptions options) 
     => Create(options.ContentRootPath, options.EnvironmentName); 

    private DomainContext Create(string basePath, string environmentName) 
    { 
     BasePath = basePath; 
     var configuration = Configuration(basePath, environmentName); 
     var connectionString = ConnectionString(configuration.Build()); 
     return Create(connectionString); 
    } 

    private DomainContext Create(string connectionString) 
    { 
     if (string.IsNullOrEmpty(connectionString)) 
     { 
      throw new ArgumentException($"{nameof(connectionString)} is null or empty", nameof(connectionString)); 
     } 
     var optionsBuilder = new DbContextOptionsBuilder<DomainContext>(); 
     return Configure(connectionString, optionsBuilder); 
    } 

    protected virtual IConfigurationBuilder Configuration(string basePath, string environmentName) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(basePath) 
      .AddJsonFile("constr.json") 
      .AddJsonFile($"constr.{environmentName}.json", true) 
      .AddEnvironmentVariables(); 
     return builder; 
    } 

    protected virtual string ConnectionString(IConfigurationRoot configuration) 
    { 
     string connectionString = configuration["ConnectionStrings:DefaultConnection"]; 
     return connectionString; 
    } 

    protected virtual DomainContext Configure(string connectionString, DbContextOptionsBuilder<DomainContext> builder) 
    { 
     builder.UseSqlServer(connectionString, opt => opt.UseRowNumberForPaging()); 

     DomainContext db = new DomainContext(builder.Options); 
     return db; 
    } 


    DomainContext IDbContextFactory<DomainContext>.Create(DbContextFactoryOptions options) 
     => Create(options.ContentRootPath, options.EnvironmentName); 
} 

public override IServiceResult<IList<Datei>> LoadAllData() 
    { 
     using (var db = this.DomainContextFactory.Create()) 
     { 
      var files = db.Datei 
       .ToListAsync<Datei>(); 

      return new ServiceResult<IList<Datei>>(files.Result, files.Result.Count); 
     } 
    } 

サンプル設定

{ 
    "ConnectionStrings": { 
    "DefaultConnection": "Put your connectionstring here" 
    } 
} 
関連する問題