DbMigrator の仕組み
新しいインスタンスを作成するコードがありますDbMigrator(new Configuration())
Configuration
は のカスタム拡張でDbMigrationsConfiguration<T>
、T はDbContext
したがって、 内Configuration
には、 と等しい ContextType があり<T>
ます。
DbMigrator がインスタンス化されると、DbContext のインスタンスを作成しようとします<T>
。コンテキストで空のコンストラクターを使用しようとするか、ジェネリック T ではなく の実際の型であるwhere<T>
の実装を探しようとします。IDbContextFactory<...>
...
DbMigrator が機能しない理由
問題は、インスタンス化するアセンブリが、検出する必要がDbMigrator
ある特定の型にアクセスできないことです。IDbContextFactory<...>
また、私のDbContext
にはデフォルトのコンストラクターがなく、そうしたくありません。だから私は例外を受け取りますThe target context '...' is not constructible.
私を悩ませているのは、私がインスタンス化している時点で、私はすでに移行中のインスタンスDbMigrator
を持っている (またはすでにインスタンス内にある可能性がある)ことです。また、 DbMigrator の内部では検出できないジェネリックにアクセスできますが、喜んでインスタンスを提供します。DbContext
IDbContextFactory<T>
質問
では、Context インスタンスのみを使用するか、指定した IDbContextFactory のインスタンスを使用するように DbMigrator に指示するにはどうすればよいでしょうか。舞台裏の魔法のジュジュに依存してこれらのものを発見しようとすると(おそらくリフレクション/ ServiceLocationを使用して)、失敗しています。
私の状況
1 つの AppDomain 内で、n
コンテキストを使用しています。1 つと言いたいところですが、通常は 2 つです。それ以上になることもあります。したがって、単一のアプリ/Web 構成プロパティ、または単一のDbConfiguration または ConnectionFactoryを指す属性デコレーターに依存するソリューションは、私にとってはうまくいきません。AppDomain ごとに 1 つしか存在できないため、その時点で必要なコンテキストに基づいて構成できない限り、無駄です。そこには小刻みに動く余地がありますが、私にはわかりません。
base
また、コンストラクターに関連するEFについて、私が理解していないjujuがあるかもしれません。DbConnection
しかし、 a の代わりに a をコンストラクターに渡すとうまくいくとは思いませんnameOrConnectionString
。まだ空のコンストラクターではありません。しかし、それを使用してコンストラクターを検索するためにEFが行うこと、およびそれを利用する方法があれば、それはうまくいくかもしれません。