В настоящее время я использую 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();
}
}