我们有一个具有Student对象的Enrollment对象,而Student对象有许多Enrollment对象 . 如果我从Enrollment的Student参考中取消Cascade.SaveUpdate(),则不会执行对Student表的更新,但是对Enrollment对象的更新会成功 . 但是,如果我在Enrollment的Student参考上添加Cascade.SaveUpdate(),则对Student表的更新工作正常,但对Enrollment表的更新失败 . 没有抛出异常,更新只是没有成功 .
必须有某种方法能够在关系的两边保存对象,但我错过了什么?
这是代码剪辑,如果您需要更多,请告诉我:
EnrollmentMap:
References(x => x.Student)
.Column("student_id");// without the cascade on the next line, this fails to update changes to Student
//.Cascade.SaveUpdate();// when uncommented this updates changes to Student but blocks updates to Enrollment
StudentMap:
HasMany(x => x.Enrollments)
.KeyColumn("student_id")
.Inverse()
.Cascade.SaveUpdate();
数据库通话:
public Application GetApplication(long applicationId)
{
using (var session = sessionFactory.OpenSession())
{
var query = session.Linq();
query.Expand(x => x.Enrollment);
query.Expand(x => x.Enrollment.Student);
var result = from entity in query
where entity.ApplicationId == applicationId
select entity;
return result.Count() > 0 ? result.First() : null;
}
}
数据库保存:
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
throw;
}
}
}
1 回答
您应该尝试在更新它的同一会话中加载实体 . 我认为这是你的问题 .
如果你真的不能这样做,那么可以将实体“合并”到你的会话中(google'NHibernate merge') .