2

コードファーストでEntityFramework5を使用しています。IDbConnectionFactoryクラスによって作成されたすべての接続に使用するカスタムを作成しDbContextたので、アプリケーションのライフサイクルの早い段階で、データベース作業が完了する前に、

Database.DefaultConnectionFactory = new MyConnectionFactory();

ただし、MyConnectionFactory.CreateConnectionが呼び出されることはありません。これは、EFが元に戻したことを示していますが、デバッガーは、MyConnectionFactoryいくつかのクエリが実行された後もまだ呼び出されていることを示しています。どういうわけか、それはそれを使用していないだけです。

DbContextはapp.configファイルから接続文字列の名前を渡すことによって初期化され、それらの接続文字列は明示的なプロバイダーを指定しているので(実際にそうしなければならないので)、それが接続の接続ごとのオーバーライドを引き起こしているのではないかと思います接続文字列に基づくファクトリ。これは発生しますか?完全に新しいプロバイダーを登録せずに停止できますか(それはそれほど難しいことではありませんが)。

これについてオンラインで見たもの(さまざまなapp.configの例でdefaultConnectionFactoryタグによってかなり隠されている)はIDbConnectionFactory、選択したインスタンスに変更するだけで機能することを示唆していますが、私の動作はしていません。

これの目的は、新しい接続が開かれるたびに特定のSQLステートメントのセットを実行できるようにすることです。したがって、この質問の2番目の部分は、これを行うためのより良い方法を誰かが知っているかどうかです。

4

2 に答える 2

5

私はそれが理想的ではないことを知っていますが、これは私にとってはうまくいきました:

public class DBBase : DbContext
{
    public DBBase(string nameOrConnectionString)
        : base(Database.DefaultConnectionFactory.CreateConnection(nameOrConnectionString), true)
    {
    }
    // ...
}
于 2013-05-09T01:20:29.587 に答える
0

使用する呼び出しごとに構築した接続を取得する必要があります。たとえば、次のコードを使用します。

private static void UsingCustomConnection()
{
    using (var conn = Database.DefaultConnectionFactory.CreateConnection("YourDbName"))
    {
        using (var context = new YourContext(conn))
        {
            context.Destinations.Add(new Destination {Name = "Colorado"});
            context.SaveChanges();
        }
    }
}

これを YourContext でセットアップする必要があります

public YourContext(DbConnection connection)
    : base(connection, contextOwnsConnection: false)
{

}
于 2013-02-27T23:47:01.780 に答える