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

C# 非法尝试将集合与两个打开的会话关联通过服务删除时出错,c#,nhibernate,service,fluent-nhibernate,C#,Nhibernate,Service,Fluent Nhibernate,有几个帖子与这个错误有关,但我遇到了一些不同的情况 非常简单的NHibernate场景。具有一对多关系的父表和子表。一个家长可以有多个孩子 我需要删除一个包含子记录的父记录,所以我将非常基本的代码放在一起,可以很好地工作: var childRecordList = new List<ChildRecord>(); var parentRecord = ParentRecordRepository.Get(parentRecordId); childRecordList = Chi

有几个帖子与这个错误有关,但我遇到了一些不同的情况

非常简单的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);

不知道为什么。帮助?

根据您的工作示例,我对您的
父存储库
在填充子存储库时所做的工作有点怀疑。如果正确设置了级联选项,并且映射包括子对象定义和父对象定义,则不应单独删除子对象,删除父对象也可以,包括按预期删除子对象。如果非要我猜的话,我会期待看到这样的情景:

ChildRecordRepository.GetAll().Where(c=>c.ParentId == Id);
存储库中的某个位置。获取父存储库和子存储库使用不同
会话
实例的调用堆栈


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

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


底线是获取和删除对象必须使用同一个会话。

为什么要使用显式的“存储库”类?是“ParentRecordRespository.Get”简单屏蔽“session.Get(parentRecordId)”?为了便于举例说明。当然,我可以写更多的细节,并在实现基本存储库功能接口的BaseRepository上进行扩展。虽然我相信这是不必要的,而且只会让人感到困惑。您是否同时在
ParentRecordRepository
ChildRecordRepository
中打开会话?这就是问题所在,每个请求/视图+1打开一个会话应该发生一次,因为这肯定会对某人有所帮助,但我的情况并非如此。
ChildRecordRepository.GetAll().Where(c=>c.ParentId == Id);