1

関数に SqlConnection を渡しています。各関数で複数のオブジェクト コンテキストが作成されます。分散トランザクション サービスをオンにすることなく、単一のトランザクション スコープで使用できるように、すべてのオブジェクト コンテキストに渡した単一の SqlConnection を使用したいと考えています。

サンプルコードは次のとおりです。

public bool InsertObjects<T>(TransactionScope transaction, SqlConnection sqlConnection, IEnumerable<T> objectsToInsert)
{
using (EntityConnection conn = GetEntityConnection())
    {
        Type objectContextType;
        ObjectContext objectContext = (ObjectContext) Activator.CreateInstance(objectContextType, new object[] {conn});

        //Some code using the objectContext

    }
}
4

2 に答える 2

1

これは良いアプローチとは思えません。なぜあなたはこれをやっている?これを機能させるには、次のことを行う必要があります。

  • すべてのコンテキストに同じ接続文字列を使用 = 同じデータベース
  • すべてのコンテキストに同じメタデータ (マッピング) を使用するか、コンテキストごとに個別のメタデータ セットを渡します
  • いずれかのコンテキストまたは操作が接続を開く場合、すべてのコンテキストが作成されるまで接続を閉じる必要があります。次のコンテキストの作成は失敗します

したがって、マッピングが複数の EDMX に分割された複雑なデータベースを使用していない限り、この概念全体は間違っています。1 つのデータベースに対する 1 つの操作 = 1 つの作業単位 = 1 つのコンテキスト = 1 つの接続。あなたの場合、単一のエンティティタイプでこれを行いたいようです-なぜですか?

さらに、独自のコレクションをオブジェクト コンテキストに渡すと、コンテキストが接続を最適な方法で処理できなくなります (必要のないときに解放します)。

于 2011-08-24T20:10:05.833 に答える
0

より良い解決策は、接続プールです。
オブジェクトに接続オブジェクトを作成し、プールオプションをオンにして接続します。
次に接続するときに、接続がまだアクティブであるかどうかを確認して使用します。
接続がない場合は接続します。

これは、接続プールの使用方法に関するガイドです

于 2011-08-25T21:07:27.373 に答える