nHibernate (a == b) равенство - PullRequest
       1

nHibernate (a == b) равенство

1 голос
/ 20 января 2010

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

См. Следующий раздел кода, например:

CrudRepository<Customer> cr1 = new CrudRepository<Customer>();
Customer c1 = cr1.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B"));

CrudRepository<Customer> cr2 = new CrudRepository<Customer>();
Customer c2 = cr2.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B"));

if (c1.Equals(c2))
    MessageBox.Show("SAME!");   // True.

if (c1.GetHashCode().Equals(c2.GetHashCode()))
    MessageBox.Show("SAME!");   // True.

if (c1 == c2)
    MessageBox.Show("SAME!");   // False.

Моя интерпретация документации nHibernate заставляет меня полагать, что после переопределения методов Equals () и GetHashCode () nHibernate может загружать сущности в одну ссылку.

Это строка, о которой я говорю:

Это применимо, только если эти объекты загружены в две разные сессии IS, поскольку NHibernate только гарантирует идентичность (a == b, реализация по умолчанию равно ()) внутри одного ISession !

Я понимаю, что (c1 == c2) сравнивает ссылки на объекты, загруженные в разное время. Однако я подумал (и надеялся), что nHibernate автоматически отследит предварительно загруженные ссылки и обновит их соответствующим образом.

Разве это не правда?

Или я что-то не так делаю?

Спасибо:)

ПРИМЕЧАНИЕ. Я использую шаблон синглтона, чтобы поддерживать один и тот же сеанс в приложении.

Редактировать: Каждый раз, когда я выполняю задачу CRUD, я использую этот класс NHibernateHelper, чтобы получить один экземпляр того же построителя сеанса. Это был пример кода.

public T GetById(Guid guid)
{
    using (ISession session = NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        return session.Get<T>(guid);
    }
}

А это мой вспомогательный класс:

public class NHibernateHelper
{
    private static ISessionFactory sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (sessionFactory == null)
            {
                var configuration = new Configuration();
                configuration.Configure();
                configuration.AddAssembly(typeof(Customer).Assembly);
                sessionFactory = configuration.BuildSessionFactory();
            }
            return sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

1 Ответ

2 голосов
/ 20 января 2010

Вы создаете новый сеанс при каждом запросе (это то, что делает ваш метод NHibernateHelper.OpenSession()), а nHibernate гарантирует равенство ссылок только в одном сеансе.Как только вы убедитесь, что ваши запросы находятся в одном сеансе, результатом двух вызовов будет один и тот же объект.

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