1

有几篇与此错误相关的帖子,但我遇到了一些不同的问题。

非常简单的 NHibernate 场景。具有一对多关系的父表和子表。一位家长可以有多个孩子。

我需要删除带有子记录的父记录,因此我将非常基本的代码放在一起,效果很好:

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);

作品。删除子记录和父记录。

如果我采用上面的逻辑并将其转换为“服务”方法,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

I tried creating a session by instantiating an instance of the repository and then doing operation on an object pulled from it. Then I would open a new session of the repository within the Service layer and try to delete the object passed from the controller created session with it. That was the problem.

The bottom line is the same session has to used to both get and delete an object.

于 2012-11-29T19:00:29.077 回答