Каково состояние объекта, если оно добавлено с использованием запроса INSERT? И как я могу получить этот объект в тот же сеанс?Использование CreateSQLQuery с запросом INSERT в NHibernate
Вставка объекта с использованием нативного SQL
session.CreateSQLQuery("INSERT INTO table (...) VALUES (...)").ExecuteUpdate())
Я знаю его Id, поэтому использовать это для ГЭТ:
sessison.Get<MyObjectType>(id)
но объект имеет нулевое значение, так как сеанс же и совершить еще находится на рассмотрении. Что я делаю неправильно?
P.S. Использование CreateSQLQuery необходимо, потому что мой дочерний объект foo создан на основе его родительской панели, но bar и foo имеют один и тот же идентификатор и используют таблицу на конкретный класс
Это не выглядит нормальным для меня. На необработанном уровне SQL мы можем читать несанкционированные данные на любом уровне изоляции при условии, что мы читаем транзакцию с ожидающими данных. Проверяя 'ExecuteUpdate', он должен немедленно отправить запрос на db. Можете ли вы проверить это в своем случае с профилировщиком? Затем 'Get' должен найти ваш новый объект, если только вы не находитесь в каком-то конкретном случае, например, если в вашем сеансе есть устаревший объект с тем же идентификатором, но помечен для удаления. Включите протоколы log4net журнала NHibernate, а журналы из 'DefaultLoadEventListener' должны предоставить вам подробную информацию. –
Нет, после ExecuteUpdate, профайлер говорит, что i ', просто отправьте Insert, но не зафиксируйте. Я думаю, что это зависит от стиля жизни ISessionProvider. –
Просто отправка вставки была тем, что я ожидал увидеть в профилировщике. В любом случае, ваш комментарий [здесь] (/ questions/36386613/using-creationqlquery-with-insert-query-in-nhibernate? Noredirect = 1 # comment60434278_36388601) говорит, что вы что-то нашли, вероятно, вы должны добавить его в качестве ответа на свой собственный вопрос, и принять его. Или, если вы не понимаете, почему ваше изменение заставляет ваш код работать, может быть, вы должны задать новый вопрос. –