NHibernate - запись никогда не сохраняется в БД в Nhibernate

0

Я пытаюсь создать объект с 4 свойствами; 1x ID и 3x ссылки на другие таблицы.

Я получаю, что мне не следует сравнивать NHibernate "session.Save()" с оператором вставки sql, но я все равно ожидаю, что он сохранит его в базе данных после завершения запроса/потока. Вот как выглядит мой код:

var session = Home.Instance.GetSession();
session.Begin();
var profile = session.Get<ProfilePO>(profileId);
var queue = session.Get<QueuePO>(queueId);
var telephone = session.Get<TelephonePO>(telephoneId);
var newObject = new UserProfileControlledQueueMembersPO
            {
                Profile = profile,
                Queue = queue,
                Telephone = telephone
            };
session.Save(newObject);
var idOfNewObj = newObject.Id; //This gets the correct value from the autoincrementing ID in the mysql database.
var newObjFromCacheOrDb = session.QueryOver<UserProfileControlledQueueMembersPO>().Where(x => x.Id == idOfNewObj).List().FirstOrDefault();
//newObjFromCacheOrDb actually return the correct values of the created object

"session" - это класс оболочки:

private int _transactionCount;
private ITransaction _transaction;
private ISession Session { get; set; }
public void Begin()
{
  if (_transactionCount <= 0)
  {
    _transaction = Session.BeginTransaction();
    _transactionCount = 0;
  }
  _transactionCount++;
}
public object Save<T>(T ob) where T : TEntityType
{
  if (_transactionCount <= 0)
  throw new Exception("Save is not allowed without an active transaction!");

  return Session.Save(ob);
}

В журнале для NHibernate я нашел следующее:

DEBUG NHibernate.SQL(null) - INSERT INTO Profile_Queue_Telephone (ProfileId, QueueId, TelephoneId) VALUES (? P0,? P1,? P2) ;? p0 = 7283 [Тип: Int32 (0: 0: 0)],? P1 = 27434 [Тип: Int32 (0: 0: 0)],? P2 = 26749 [Тип: Int32 (0: 0: 0)]

DEBUG NHibernate.SQL(null) - SELECT LAST_INSERT_ID()

DEBUG NHibernate.SQL(null) - SELECT this_.Id as id1_45_0_, this_.ProfileId as profileid2_45_0_, this_.QueueId как queueid3_45_0_, this_.TelephoneId как phone4_45_0_ FROM Profile_Queue_Telephone this_ WHERE this_.Id =? P0;? P0 = 74 [Тип: Int32 (0: 0: 0)]

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

Итак, мой вопрос в том, что мне здесь не хватает, что мне делать, чтобы вставить объект в базу данных?

Редактировать:

Возможно, стоит отметить, что я очень новичок в NHibernate. Я работаю над 4+ летним проектом, написанным в NHibernate.

  • 0
    Вы на 100% уверены, что база данных, в которую вы пишете, и та, которую вы просматриваете для проверки данных, - это та же база данных?
  • 0
    Да, таблица не существует в нашей производственной базе данных, она существует только в моей базе данных dev. Плюс у меня есть другие методы, которые просто отлично сохраняют данные в той же базе данных.
Показать ещё 3 комментария
Теги:
nhibernate
fluent-nhibernate

1 ответ

2
Лучший ответ

Ваш метод wrapper session.Begin() запускает транзакцию, но вы никогда не вызываете соответствующую Commit чтобы навсегда сохранить изменения в базе данных. Без этого изменения будут отброшены назад, а ваша база данных останется нетронутой. Один из ваших методов обертки должен вызывать _transaction.Commit, найти этот метод и вызвать его.

  • 0
    Эта часть с началом и сохранением, которую я написал, была вложенной частью запроса, который также делал другие вещи. Позже в коде был сеанс.Begin (), но также и session.Commit (). Раньше я пытался с помощью session.Commit () сразу после сохранения в фрагменте кода в моем вопросе, но он не работал. Удаление session.Begin (), которое было позже в коде, и проверка того, что session.Commit () был достигнут, действительно решило проблему. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню