我有两个实体与一个赋值实体绑在一起。例如
class School
{
public virtual IList<Enrollment> Enrollments
{
get { return enrollments; }
}
public virtual void UnassignEnrollment(Student theStudent)
{
var e = enrollments.FirstOrDefault(x => x.Student == x);
enrollments.Remove(e);
}
}
class Student
{
public virtual String Name { get; set; }
}
class Enrollment
{
public virtual Student Student
{
get { return student; }
}
public virtual School School
{
get { return student; }
}
}
注册的映射
<bag name="Enrollments" cascade="all-delete-orphan" inverse="true" access="nosetter.camelcase" lazy="true">
<key column="School_Guid" />
<one-to-many class="SBL.Enrollment, SBL" />
</bag>
现在,当我想删除学生时,我基本上是在做以下
foreach(var school in assignedSchools)
school.UnassignEnrollment(student);
Session.Delete(student);
我看到的问题是nhibernate会在注册之前尝试删除学生,即使我在删除学生之前孤立注册(因为Session.Delete会立即将删除操作添加到操作队列但添加了孤立对象)在刷新/提交之后的一些进程之后,这会导致数据库层中的引用问题。
我可以让它在调用Delete()之前刷新会话,但我想避免手动刷新。我也可以通过双向映射和级联删除注册与删除学生来实现它,但我会将集合映射为删除内容的方式 - 我想避免的事情。
如何通过执行删除或数据建模的方式来解决这个问题?