3

ASP.NetコアAPIを構築しており、DBContextOptionsから接続文字列を取得する方法を見つけることができませんでした。ASP.NetコアのSqlServerDBContextOptionsExtensionsから接続文字列を取得する方法

私は以下のように私のstartup.csにDBContextを持っています。

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddApplicationInsightsTelemetry(Configuration); 

    services.AddEntityFrameworkSqlServer() 
     .AddDbContext<MainContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MainConnection"))); 

    services.AddMvc() 
     .AddJsonOptions(opt => 
     { 
      opt.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     }); 
} 

私のコンテキストクラスでは、次のコンストラクタがあります。

public MainContext(DbContextOptions<MainContext> options) : base(options) 
{ 

} 

実際の接続文字列をDBContextクラスのOnConfiguringメソッドに追加しないと機能しません。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    //TODO Move connection string to a secure location 
    optionsBuilder.UseSqlServer(@"Server= ....."); 

} 

私はデバッグするときStartup.csがappsettings.jsonファイルから正しい接続文字列を取得していることを確認し、Configuration.GetConnectionString(「のmainConnection」)の値を調べることができます。

DIを介してDbContextクラスにオプションを渡すと接続文字列が渡されたと思いますが、DbContectクラスはOnConfiguringメソッドのoptionBuilder.UseSqlServer()を持たないと動作しません。

私は、これはSO、私はそれを使用しようとすると、オプションのプロパティから接続文字列を抽出するために、次のコードを使用する方法について協議

public ResourceDbContext(DbContextOptions options) : base(options) 
{ 
    _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString; 
} 


protected override void OnConfiguring(DbContextOptionsBuilder options) 
{ 
    options.UseSqlServer(_connectionString); 
} 

しかし、私はAもはや存在しないことを見つけること、https://stackoverflow.com/questions/33532599/asp-net-5-multiple-dbcontext-problemsを投稿しましたoptions.Extensions

だから、私の最初の質問があるの最初の()メソッド...

ないのはなぜOnConfiguring方法

に接続文字列を追加することなくDBContextクラスの仕事

接続文字列は、私はオプションではなく、明示的にOnConfiguring方法でそれを提供することよりも物体DbContextOptionsからそれを得ることができるか、OnCOnfiguring方法で必要とされている場合は私の2番目の質問は...

ある - > optionsBuilder .UseSqlServer(@ "Server = .....");内部

答えて

2

は、あなたのappsettings.json次を作成します。

{ 
    "Database" : { 
      "ConnectionString" : "..." 
     } 
} 

そして、中にあなた ConfigureServices次の操作を行います。基本的に IConfigurationRootプロパティを移入します

services.AddSingleton(_ => Configuration); 

。あなたはどこに注入し、そして実行して、接続文字列にアクセスすることができる。

private readonly IConfigurationRoot configuration; 
private IDbConnection dbConnection { get; } 

public Example(IConfigurationRoot configuration) 
{ 
    this.Configuration = configuration; 
    dbConnection = new SqlConnection(this.configuration.GetConnectionString("...")); 
} 

私は少し奇妙これを構造化、あなたが本当に単に別のクラスにConnectionStringを渡す、または方法注入するが、これはあなたのための実証します。しかし、Entity Framework 7には接続文字列を直接受け入れるファクトリがあると私は思っています。うまくいけば、これはあなたを助けます。

Entity Frameworkは、それはあなたのConfigureServicesの内側に、次のようにする必要があります:

services.AddSingleton<dbContext>(_ => new dbContext(Configuration.GetConnectionString("..."))); 
public class dbContext : DbContext 
{ 
    public dbContext(string dbConnection) : base(dbConnection) 
    { 

    } 
} 

いくつかの余分なdocumentation

0

は、少なくともEFコア1.1について、あなたはあなたのStartup.cs

opt.UseInMemoryDatabase()を使用している場合にはそこにある FindExtension<SqlServerOptionsExtension>()

using Microsoft.EntityFrameworkCore; 
using Microsoft.EntityFrameworkCore.Infrastructure.Internal; 

namespace MyNamespace 
{ 
    public class MyContext : DbContext 
    { 
     public MyContext(DbContextOptions<MyContext> options) : base(options) 
     { 
      var sqlServerOptionsExtension = 
        options.FindExtension<SqlServerOptionsExtension>(); 
      if(sqlServerOptionsExtension != null) 
      { 
       string connectionString = sqlServerOptionsExtension.ConnectionString; 
      } 
     } 
    } 
} 

ヌルチェックを使用する必要があります

関連する問題