2017-01-20 20 views
6

LinqPadのエンティティフレームワークコアDbContextsのサポートの欠如(まだ)をハックする何かが欠けているか何かがあるかどうかを調べようとしています。私は4.6.1(suggested on the LinqPad forumとして)をターゲットにしてコードをコンパイルし、 "Entity Framework V7"ドライバを試しましたが、その名前が示すように、最新のものではないと思います。それでも、コンストラクタのapp.configファイルまたは接続文字列を要求します。LinqPadをEF Coreコンテキストで動作させる方法はありますか?

Add context dialog

EFコア・コンテキストが構築ではなく、接続文字列のためのDbContextOptionsを使用しているので、私はおそらく、接続文字列を取るコンストラクタのオーバーロードを作成することができます考えていたが、それは基本的なデータベースドライバを処理しません。コンテキストを構築するためのファクトリを指定する方法はありますか?他の可能性は?私はLinqPadなしで失われた気分です。

答えて

2

ドライバはバグであると思われます。私はDbContextを変更することでそれを回避する方法を見つけました。理論的には

、これは働いているはずですが、それはしていません:

private string _connectionString; 
public ApplicationDbContext(string connectionString) : base() 
{ 
    _connectionString = connectionString; 
} 
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    if (_connectionString == null) 
     base.OnConfiguring(optionsBuilder); // Normal operation 

    // We have a connection string 
    var dbContextOptionsBuilder = new DbContextOptionsBuilder(); 
    optionsBuilder.UseSqlServer(_connectionString); 
    base.OnConfiguring(dbContextOptionsBuilder); 
} 

LinqPad EFコアドライバは、「文字列を受け入れるコンストラクタを介して、」あなたが指定した場合でも、パラメータなしのコンストラクタを探し続けています。それはドライバーのバグのようだ。

それで、私はそれが望んでいた、無パラメータのコンストラクタを与えました。私はIoC/appsettings.json設定リーダーがロードされていないので接続文字列をハードコードしなければならず、DbContextでそれを別々にロードする気がしません。しかし、それは動作し、LinqPadのEF Coreクエリを私のモデルからテストすることができます。

これは私のために正常に動作します:

private bool _isDebug = false; 
public ApplicationDbContext() : base() 
{ 
    _isDebug = true; 
} 
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    if (!_isDebug) 
     base.OnConfiguring(optionsBuilder); // Normal operation 

    // We are in debug mode 
    var dbContextOptionsBuilder = new DbContextOptionsBuilder(); 
    // Hardcoded connection string 
    optionsBuilder.UseSqlServer("data source=XXXX;initial catalog=XXXX;persist security info=True;user id=XXXX;password=XXXX;MultipleActiveResultSets=True;App=EntityFramework"); 
    base.OnConfiguring(dbContextOptionsBuilder); 
} 

は、これは当然の既存public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }に加えています。

編集:これは、サーバーに展開するまで表示されないデフォルトの動作を上書きするように見えます。

3

最新のEFCore 1.1 LINQPadドライバ(v1.1.1.1)では、LINQPadでこのオプションが選択されている場合、文字列を受け入れるコンストラクタを正しく使用できます。

だから、次のコンストラクタを追加することが可能です:

public ApplicationDbContext(string connectionString) : this(new DbContextOptionsBuilder<ApplicationDbContext>() 
     .UseSqlServer(connectionString).Options) 
    { } 

これは、ハードSQL Serverのプロバイダに、しかし少なくともいない接続文字列にこのコンテキストインスタンスをリンクします。さらに、あなたのアプリはこのコンストラクタを使用しようとは思わないでしょう、EF Coreはctorを期待/促進しません。文字列を受け入れる。

安全性をさらに高めるため、#if DEBUG ... #endifにこのコンストラクタをラップすることで、決して生産されないようにすることができます。

関連する問題