通过服务删除时,非法尝试将集合与两个打开的会话相关联

时间:2012-11-19 20:53:24

标签: c# nhibernate service fluent-nhibernate

有几个与此错误相关的帖子,但我遇到了不同的事情。

非常简单的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)”的服务方法,则会因{strong>非法尝试将集合与两个打开的会话关联错误而开始失败ParentRecordRepository.Delete(parentRecord); 1}}

通过实例化服务类然后调用DeleteRecord方法来调用服务:

var parentRecord = ParentRecordRepository.Get(id);

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

无法弄清楚原因。帮忙?

2 个答案:

答案 0 :(得分:2)

根据你的工作示例,我对你ParentRepository正在做什么来填充它的孩子有点怀疑。如果您正确设置了级联选项并且映射包含父对象的子对象定义,那么您不应该单独删除子级,并且删除父级将起作用,包括按预期删除子级。如果我不得不猜测,我会期待看到类似的东西:

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

父级Repository.Get callstack中的某处,父级和子级存储库使用不同的Session个实例。

也许提供父和子的映射配置,以及父Get()方法的内容。

答案 1 :(得分:1)

我尝试通过实例化存储库的实例然后对从中拉出的对象进行操作来创建会话。 然后我将在Service层中打开一个新的存储库会话,并尝试删除从控制器创建的会话传递的对象。这就是问题所在。

底线是用于获取和删除对象的相同会话。