1

このエラーに関連する投稿がいくつかありますが、私は何か違うことに遭遇しています。

非常に単純な NHibernate シナリオ。1 対多の関係を持つ親テーブルと子テーブル。1 つの親が複数の子を持つことができます。

子レコードを含む親レコードを削除する必要があるため、正常に機能する非常に基本的なコードをまとめました。

var childRecordList = new List<ChildRecord>();

var parentRecord = ParentRecordRepository.Get(parentRecordId);
childRecordList = ChildRecordRepository.GetAll().Where(c=>c.ParentRecord.Id==parentRecord.Id);

foreach(var childRecord in childRecordList)
{
 ChildRecordRepository.Delete(childRecord);
}

ParentRecordRepository.Delete(parentRecord);

動作します。子レコードと親レコードを削除します。

上記のロジックを " " としてサービス メソッドに変換すると、コレクションを 2 つの開いているセッションに関連付けようとDeleteRecord(ParentRecord parentRecord)する不正な試みで失敗し始めます。ParentRecordRepository.Delete(parentRecord);

サービスは、サービス クラスをインスタンス化してから DeleteRecord メソッドを呼び出すことによって呼び出されます。

var parentRecord = ParentRecordRepository.Get(id);

var recordService = new RecordService();
recordService.DeleteRecord(parentRecord);

理由がわかりません。ヘルプ ?

4

2 に答える 2

2

あなたの実例に基づいて、私はあなたParentRepositoryが子供たちに何をしているのか少し疑わしいです。カスケード オプションが正しく設定されていて、マッピングに子オブジェクトの定義と親が含まれている場合、子を個別に削除するべきではありません。親の削除は、期待どおりに子を削除することを含めて機能します。推測する必要がある場合、次のようなものが表示されると予想されます。

ChildRecordRepository.GetAll().Where(c=>c.ParentId == Id);

Repository.Get親リポジトリと子リポジトリが異なるSessionインスタンスを使用している親コールスタックのどこか。

おそらく、親と子のマッピング構成と、親のGet()メソッドの内容を提供します。

于 2012-11-19T21:39:59.153 に答える
1

リポジトリのインスタンスをインスタンス化し、そこからプルされたオブジェクトを操作してセッションを作成しようとしました。次に、サービス層内でリポジトリの新しいセッションを開き、コントローラーで作成されたセッションから渡されたオブジェクトを削除しようとします。それが問題でした。

肝心なのは、オブジェクトの取得と削除の両方に同じセッションを使用する必要があるということです。

于 2012-11-29T19:00:29.077 に答える