Свободный NHibernate один-ко-многим Cascade.SaveUpdate () блокирует обновления сущности - PullRequest
0 голосов
/ 16 июля 2010

У нас есть объект Enrollment, в котором есть объект Student, а в объекте Student есть много объектов Enrollment. Если я опущу Cascade.SaveUpdate () из ссылки на студента Enrollment, обновления таблицы Student не будут выполнены, но обновления объекта Enrollment завершатся успешно. Но если я добавлю Cascade.SaveUpdate () в ссылку на студента Enrollment, обновления таблицы 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 Ответ

2 голосов
/ 16 июля 2010

Вы должны попытаться загрузить вашу сущность в том же сеансе, когда вы ее обновляете. Я думаю, что это твоя проблема.

Если вы действительно не можете этого сделать, тогда можно «объединить» сущность с вашей сессией (Google «NHibernate merge»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...