Сессия Nhibernate не обновляется - PullRequest
3 голосов
/ 11 февраля 2011

Я замечаю странное поведение в моем приложении, которое использует NHibernate

Чтобы дать вам немного фона, в базе данных есть 2 таблицы:

1) Транзакция 2) Автомобиль

Транзакция связана с транспортным средством один на один.

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

Поэтому, когда я запускаю следующий код, все работает, как задумано.

Transaction t;

using (var session = sessionFactory.OpenSession())
{
    t = dbHelper.GetAll<Transaction>(session)[0];

    t.Vehicle.Odometer = "777";

    dbHelper.Save(t, session);  // This updates the vehicle table's odometer property to 777    
}

Однако, если я изменю свой код следующим образом

Transaction t;

using (var session = sessionFactory.OpenSession())
{
    t = dbHelper.GetAll<Transaction>(session)[0];
}

using (var session = sessionFactory.OpenSession())
{
    t.Vehicle.Odometer = "777";

    dbHelper.Save(t, session);  // This does not update the vehicle table.

    // but

    dbHelper.Save(t.Vehicle, session); // Works  
}

Значит ли это, что свойства отношений зависят от сеанса?

редактирование:

Я использую Fluent с AutoMapper, и это одно из классифицированных правил, которые я использую:

internal class OneToOneConvention : IHasOneConvention 
{ 
   public void Apply(IOneToOneInstance instance) 
   { 
     instance.Cascade.All(); 
   } 
}

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

Вот 2 метода внутри dbHelper

  public void Save<T>(T entity, ISession session) 
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                try
                {
                    session.SaveOrUpdate(entity);
                    transaction.Commit();
                }

                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

и GetAll

public IList<T> GetAll<T>(ISession session) where T : class
        {
                return session.CreateCriteria<T>().List<T>();
        }

Ответы [ 2 ]

0 голосов
/ 11 февраля 2011

От Транзакции к Транспортному средству отношение много к одному, а не к одному. Как у вас это отображается?

Я согласен, что это (dbHelper) не очень хорошая модель для работы с NHibernate.

0 голосов
/ 11 февраля 2011

Вы делаете это неправильно. Когда вы получаете объект Transaction, вы должны внести изменения в этот NH Session. Вместо использования сеанса, который расположен после блока using, а затем вы создаете новый. Если вам нужно отделить некоторую логику после того, как вы получите объект от некоторого Session, тогда вы должны передать свой Session вместо создания нового. Поэтому рабочий процесс в вашем случае должен быть следующим:

  1. Открыть сеанс и получить Transaction объект
  2. Выполнение CRUD-операций над объектом (с транзакцией NHibernate)
  3. Подтверждение или откат транзакции
  4. Закрытие сессии
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...