2011-09-28 111 views
1

我收到的错误是常见的,但情况我还没有找到任何答案,说我的方案:如何删除引用的对象使用FluentNHibernate(ye olde“删除的对象将重新级联”)

实体:

学校 教师 学生

映射:

School: mapping.HasMany(x => x.Students).Cascade.AllDeleteOrphan(); 
Student: 
     mapping.References(x => x.Teacher).Not.Nullable().Cascade.SaveUpdate(); 
     mapping.References(x => x.School).Not.Nullable().Cascade.SaveUpdate(); 
Teacher: 
     mapping.References(x => x.School).Not.Nullable().Cascade.SaveUpdate(); 
     mapping.HasMany(x => x.Students).Cascade.All().Inverse(); 

方案:学生与没有其他学生或教师的学校相关联。如果我想将学生链接到不同的学校,我想删除孤儿学校。

if (oldSchool.Students.Count == 1 && oldSchool.Teachers.Count == 0) 
{ 
    //delete it 
    //oldSchool.Students.Remove(student); 
    student.School = null; 

    _schoolRepository.Delete(oldSchool); 
} 

这里会发生什么事是,当我去救人“学生”,我得到了可怕的错误“已删除对象将通过级联重新保存”。

一如既往,任何帮助非常感谢。

回答

0

你的映射的其余部分是什么样的?学校和学生之间的相反设置是什么?

尝试mapping.HasMany(x => x.Students).Cascade.AllDeleteOrphan().Inverse()

+0

这就是涉及这些类的映射的总和。我不清楚Inverse在参考场景与HasMany/HasOne场景中的位置。将尝试。 – sydneyos

+0

实际上,这是我被绊倒的地方 - 参考没有Cascade.AllDeleteOrphan选项,也没有和Inverse()选项。 – sydneyos

+0

对,我应该在发布之前检查我的伪代码 - 通常不会在引用结束时放置一个反向 - 它应该放在mapping.HasMany(x => x.Students)方面。至于AllDeleteOrphan,你从我看到的内容中得到了正确的答案。你可以做的一件事是发布实际的映射文件,调整它们直到它们工作,然后弄清楚如何使用FNH发出调整后的文件。我已更新我的回答以反映此评论。 – rbellamy

相关问题