2016-08-11 23 views
2

このプロジェクトでは、.NETから.NETコアに移行しようとしています。ここでは.NETコアで実装したいコードがあります。DbContextのベースコンストラクタパラメータを渡す際にそれを変更するにはどうすればよいですか?

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base("name=CompanyFormsContext") 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base("name=" + connName) 
    { 
    } 
... 
} 

.NETコアでは、文字列はDbContextのパラメータとして受け入れられません。代わりに、パラメータとしてDbContextOptionsを渡すことができます。たとえば、次のリンクで:http://ef.readthedocs.io/en/latest/miscellaneous/configuring-dbcontext.html

あなたは例を見ることができます:

public class BloggingContext : DbContext 
{ 
    public BloggingContext(DbContextOptions<BloggingContext> options) 
     : base(options) 
    { } 

    public DbSet<Blog> Blogs { get; set; } 
} 

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 
optionsBuilder.UseSqlite("Filename=./blog.db"); 

using (var context = new BloggingContext(optionsBuilder.Options)) 
{ 
    // do stuff 
} 

私が何をしたいのかこれに類似しています。私はおそらくDbContextOptionsのインスタンスを作成して渡すことができましたが、基本クラスのコンストラクタを渡すときにSqlServer接続を変更する方法がわかりません。

私が理解できない最も重要なことは、デフォルトの "CompanyFormsContext"接続を引き起こす空のコンストラクタを保持できるようにしたいということです。 CompanyFormsContextコンストラクタのパラメータとして渡している間に接続名を変更するだけでいいですね。

私は基本コンストラクタの代わりに次のように考えていましたが、ベースコンストラクタの機能を維持することをお勧めします。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     if (connName == null) 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=CompanyFormsContext"); 
     } 
     else 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=" + connName); 
     } 
    } 

答えて

2

あなたは渡された接続文字列から作成されますDbContextOptions<BloggingContext>を返す静的メソッドを作成することができます。

だからあなたのクラスには、次のようなものになります:

public partial class CompanyFormsContext : DbContext 
{ 
    public CompanyFormsContext() 
     : base(CreateOptions(null)) 
    { 
    } 

    public CompanyFormsContext(string connName) 
     : base(CreateOptions(connName)) 
    { 
    } 

    private static DbContextOptions<BloggingContext> CreateOptions(string connName) 
    { 
     var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 
     optionsBuilder.UseSqlite("Filename=./blog.db"); 
     if (connName == null) 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=CompanyFormsContext"); 
     } 
     else 
     { 
      optionsBuilder.UseSqlServer(@"Server=.\;Integrated Security=True;Database=" + connName); 
     } 
     return optionsBuilder.Options; 
    } 
+0

この1つはないようなので、それは私にエラーを与えていないだろう:http://rextester.com/LISAO70300を?私はコンストラクタにメソッドを渡そうとしています。 –

+0

@KemalTezerDilsiz申し訳ありませんが、私は静的メソッドが必要だと書いていましたが、私のコードサンプルで 'static'キーワードを忘れてしまいました。それを私が直した。 – Koopakiller

関連する問題