我们有一个具有Student对象的Enrollment对象,而Student对象有许多Enrollment对象。如果我从Enrollment的Student参考中取消Cascade.SaveUpdate(),则不会执行对Student表的更新,但是对Enrollment对象的更新会成功。但是,如果我在Enrollment的Student参考上添加Cascade.SaveUpdate(),则对Student表的更新工作正常,但对Enrollment表的更新失败。没有抛出异常,更新只是没有成功。
必须有某种方法可以在关系的两边保存对象,但我缺少什么?
以下是代码剪辑,如果您需要更多信息,请告诉我们:
注册地图:
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; } } }
答案 0 :(得分:2)
您应该尝试在更新它的同一会话中加载您的实体。我认为这是你的问题。
如果你真的不能这样做,那么可以将实体“合并”到你的会话中(google'NHibernate merge')。