首页 文章

流畅的NHibernate一对多Cascade.SaveUpdate()阻止对实体的更新

提问于
浏览
0

我们有一个具有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 回答

  • 2

    您应该尝试在更新它的同一会话中加载实体 . 我认为这是你的问题 .

    如果你真的不能这样做,那么可以将实体“合并”到你的会话中(google'NHibernate merge') .

相关问题