0

次のように、DAL から BAL にオブジェクトを返す n 層の asp.net アプリケーションがあります。

public IEnumerable<SourceKey> Get(SourceKey sk)
{
    var query = from SourceKey in _dataContext.SourceKeys
                select SourceKey;

    if (sk.sourceKey1 != null)
    {
        query = from SourceKey in query
                where SourceKey.sourceKey1 == sk.sourceKey1
                select SourceKey;
    }

    return query.AsEnumerable();
}

この結果はビジネス レイヤーを通過し、UI レイヤーに到達してエンド ユーザーに表示されます。アプリケーションの他のレイヤーでのクエリの実行を防ぐために、遅延読み込みは行いません。

オブジェクトを削除するために、DAL に別の関数を作成しました。

public void Delete(SourceKey sk)
{
    try
    {
        _dataContext.DeleteObject(sk);
        _dataContext.SaveChanges();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message + " " + ex.StackTrace + " " + ex.InnerException);
    }
}

「Get」関数を呼び出した後に「Delete」を呼び出そうとすると、次のエラーが表示されます。

セッションで他のスレッドが実行されているため、新しいトランザクションは許可されません

これは ASP.Net アプリです。私の DAL にはエンティティ データ モデルが含まれています。上記の関数を含むクラスは、コンストラクターでインスタンス化された同じ _dataContext を共有します。私の推測では、リーダーは「Get」関数からまだ開いており、閉じられていません。どうすれば閉じることができますか?

私の UI レイヤーでは、結果をループして、次のように削除しようとします。

foreach(SourceKey sk in skm.Get(new SourceKey()))
{
    Debug.WriteLine(sk.sourceKey1);

    skm.Delete(sk);
}

編集

エラーは次の行で発生しています。

_dataContext.DeleteObject(sk);
4

1 に答える 1

1

これは、Linq によるクエリの処理に関係していると思われます。過去に読んだ記事に基づいて推測していますが、クエリは遅延実行されていると思います.enumeratorが最初に使用された時点(最初のMoveNext呼び出し)からクエリが開かれ、それまで閉じられません.列挙が完了します。

列挙を制御している場合は、列挙子が完了することを確認し、それが違いを生むかどうかを確認できます。または、クエリの実行方法を制御する構成がどこかにある可能性が高いですが、それは私が調べた範囲を超えています。

于 2010-05-24T14:31:39.490 に答える