NHibernate - запись никогда не сохраняется в БД в Nhibernate - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь создать объект с 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

"сеанс" из класса-оболочки:

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) - ВСТАВИТЬ INTO Profile_Queue_Telephone (ProfileId, QueueId, TelephoneId) ЗНАЧЕНИЯ (? P0,? P1,? P2);? P0 = 7283 [Тип: Int32 (0: 0: 0)], ? p1 = 27434 [Тип: Int32 (0: 0: 0)],? p2 = 26749 [Тип: Int32 (0: 0: 0)]

ОТЛАДКА NHibernate.SQL (null) - ВЫБРАТЬ LAST_INSERT_ID ()

DEBUG NHibernate.SQL (null) - ВЫБЕРИТЕ this_.Id в качестве ID_1_45; [Тип: Int32 (0: 0: 0)]

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

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

Изменить:

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

1 Ответ

0 голосов
/ 04 июля 2018

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

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