Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
nHibernate(a==b)等式_Nhibernate - Fatal编程技术网

nHibernate(a==b)等式

nHibernate(a==b)等式,nhibernate,Nhibernate,我目前使用的是nHibernate,但有一个问题,即两个对象分别加载,但在数据库中表示同一个实体,它们的引用不相等 例如,请参见以下代码部分: CrudRepository<Customer> cr1 = new CrudRepository<Customer>(); Customer c1 = cr1.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B")); CrudRepository<Custome

我目前使用的是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.

您正在为每个请求创建一个新会话(这是您的
NHibernateHelper.OpenSession()
方法所做的),并且nHibernate只保证一个会话内的引用相等。一旦您确保您的请求在同一个会话中,两个调用的结果将是同一个对象。

在整个应用程序中保持相同的会话是什么意思。您是只创建一个会话实例,还是为每个工作单元、操作、请求或其他任何内容创建一个新的会话实例?谢谢Thomas。我没注意到!你对会话管理有什么建议吗?这样也许我已经加载的收藏可以保持活动状态?我这样问是因为我看到其他用户提到会话不应该保持打开状态,而应该在每次操作后关闭。你怎么认为?再次感谢。在修改nHibernateHelper类以持久化会话之后,我发现CRUD操作周围的“Using”语句正在关闭会话。在解决了您提到的问题后,使用“我的对象”的问题现在是相等的:)Thanks@TonyDay迟来的评论,但仍然。。。诀窍在于正确定义“操作”。操作不是存储库上的单一方法-当人们说“每次操作后关闭”时,操作通常是一个完整的用户请求。因此,该模式可以被称为每请求会话。这也使您能够正确地在同一事务中运行完整的请求。@Oskarbergren您的评论非常有用。当时,由于我使用的是桌面应用程序,所以我对每请求会话的方法没有太多的了解。由于我一直在web应用程序领域工作(使用Spring),幸运的是,我现在对这种方法有了更好的理解。感谢您的留言:-)
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();
    }
}