私は再利用可能なベースリポジトリクラスを作成しています。このクラスでは、開発者がを表すジェネリックを渡しObjectContext
、ベースリポジトリが。を使用してそのインスタンスを作成しますActivator.CreateInstance
。デバッグするときは、nugetパッケージを利用したいと思いますCommunityEFProviderWrappers.EFTracingProvider
。したがって、オブジェクトコンテキストを設定するための私のコードは次のようになります。
public void RenewDataContext()
{
#if DEBUG
// get the default container name
var containerName = Activator.CreateInstance<T>().DefaultContainerName;
// create an instance of the object context using EF Trace
Context = (T)Activator.CreateInstance(typeof(T), EFTracingProviderUtils.CreateTracedEntityConnection(containerName));
Context.EnableTracing();
#else
Context = Activator.CreateInstance<T>();
#endif
}
ObjectContext
問題は、EFTracingProvider
:"指定されたスキーマが無効です。エラー:\ r \ n(0,0):エラー0175:指定されたストアプロバイダーが無効であるインスタンスを作成しようとすると、常に次のエラーがスローされることです。構成で見つかったか、無効です。」
containerNameをWeb構成の接続文字列の名前に置き換え、最初の名前を行わない場合は、Activator.CreateInstance<T>()
正常に機能します。したがって、この問題は、最初のインスタンスを作成してから2番目のインスタンスを作成するという事実と関係があります。
これが私が試したことです:
- 最初のインスタンスを破棄してnullにします。
- 最初のインスタンスで接続を閉じます。
- 最初のインスタンスをusingステートメントに入れます。
- スタートアッププロジェクトのweb.configの接続文字列にObjectContextを含むアセンブリを明示的に定義します(Entity Framework Entity Connectionを使用する場合のMetadataException)
ObjectContext
開発者が一般的なタイプのANDと接続文字列の名前を渡さないようにしています。それは一種の冗長なようです。
だから私の質問は:オブジェクトコンテキストを表すジェネリックから接続名を取得し、それを使用してEFトレースによって生成されたEntityConnectionを使用してオブジェクトコンテキストのインスタンスを作成するにはどうすればよいですか?
私の質問は、この方法が機能しない理由についてであり、考えられる回避策についてではありません。