2016-04-21 3 views
0

Я использую FluentNHibernate с WebApi 2.0. Я дам небольшое небольшое представление о том, чего я пытаюсь достичь.FluentNHibernate SaveOrUpdate error

Итак, у меня есть 2 таблицы в моей Azure DB, для таблицы простоты 1 Emails, а вторая таблица Events.

Так что в моем EmailsController в основном вызывающий абонент передает некоторые данные, которые в основном состоят из электронной почты (т. Е. Темы, отправителя и т. Д. И т. Д.).

Усложнение возникает из-за того, что в моей таблице Emails я генерирую первичный ключ в коде. Это 32-символьный GUID.

Основной ключ в таблице Events - это поле сгенерированное БД с IDENTITY.

Для удобства использования моего веб-приложения мне нужно иметь возможность сохранить первое соответствующее событие в моем почтовом объекте.

Так что, в основном, я вызываю Save на свой объект электронной почты. Затем немного дальше вниз. Я вызываю Save на объект моих событий. Поскольку PK для таблицы Events автоматически генерируется через Azure. Я могу получить это, однако осложнение возникает, когда я хочу изменить свой объект электронной почты и сохранить его обратно в БД.

Я продолжаю получать следующее сообщение об ошибке другой объект с тем же значением идентификатора уже был связан с сессией

Я знаю , что средства ошибок, и это достаточно просто понять, но как я идете об исправлении этого?

Мне нужно сохранить автоматически сгенерированный PK из объекта Events, обратно в другое поле в мой объект электронной почты. Звучит просто, но не может для меня жизнь заставить эту работу работать.

Я пробовал звонить Merge (что было заменой SaveOrUpdateCopy), но все еще не работает. Кажется, на самом деле это не сохраняется.

Я могу опубликовать код для сопоставления, а также мои методы для вызова простых методов Save.

Любое простенькое исправление к этому?

+0

Есть ли у вас какие-либо отношения между письмами и событиями? Может быть, объект Event сохраняется, когда вы сохраняете объект электронной почты? – chameleon86

+0

Это отношения от одного до многих. Объекты сохраняются. Сначала я сохраняю объект электронной почты перед вызовом Save on the Events. –

+0

Делает ли «когда я хочу редактировать свой объект электронной почты и сохранять его обратно в БД» означает, что вы загружаете ранее сохраненный объект из db, изменяете его и затем сохраняете обратно в db? Если да, как вы его загружаете? Возможно, именно здесь вы получаете вторую копию объекта с тем же идентификатором. Используете ли вы сеанс за запрос? Что произойдет, если вы используете 'session.Flush()' после 'session.Save()' при первом сохранении события и электронной почты? –

ответ

1

Save предназначен только для вставки нового объекта. Не используйте Save для обновления существующего объекта.

Если объект был загружен с вашего текущего сеанса NHibernate, вам просто нужно зафиксировать транзакцию. Нет необходимости сообщать NHibernate, что вы его модифицировали. (Или очистите сеанс, если вы не используете транзакции, что было бы плохо с NH по многим причинам, но это не по теме для вашей проблемы.)

Если ваше лицо отделено от текущей сессии, для присоединения его к обновлению в сеансе с помощью ISession.Update. (В этот момент он не будет обновляться в БД. Вам все равно придется зафиксировать текущую транзакцию (или очистить сеанс, если вы не используете транзакцию).)

На данный момент (вызов Update), если у вас есть ошибка другой объект с тем же значением идентификатора уже была связана с сессией, это означает, что вы уже загрузили этот объект в сессии. Это выглядело бы как ненормальное использование сеанса:
Либо вы сохраняете свою сущность непосредственно из де-сериализации JSON, а затем вы уже не должны ее загружать в сеансе, который вы используете для этого. Или сначала загрузите объект для обновления из сеанса, затем скопируйте значения, чтобы обновить его, и, наконец, просто совершите транзакцию.

Быстрая & некрасиво исправление не пытается отладить, почему у вас уже есть в вашей сессии может быть назвать это перед вашим Update:

session.Evict(session.Load<YourEntityType>(itsKey)); 

Но это лишь временное решение для не исследуя то, что на самом деле неправильно с вашим кодом.

+0

просто попробовал это. Странно, никаких ошибок не было, но мое поле не обновлялось. –

+0

Выполняете ли вы транзакцию (или сеанс очистки, если нет транзакции), прежде чем проверять поле, обновляется в вашей БД? (Я также добавил это в свой ответ тоже.) –

+0

Здравствуйте, Фред, решил эту проблему через триггер. Спасибо за ответы. –

Смежные вопросы