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

时间:2010-07-15 22:42:34

标签: nhibernate fluent-nhibernate

我们有一个具有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;
                    }
                }
            }

1 个答案:

答案 0 :(得分:2)

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

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