次のように、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);