nhibernate“保存”->“获取”问题

nhibernate“保存”->“获取”问题,nhibernate,load,save,Nhibernate,Load,Save,你好, 我正在使用nhibernate,在我的网站上注册用户时遇到问题 当用户想要注册时,我在数据库中创建新的用户记录,并且在系统登录用户之后立即创建 问题就在这里。。。创建我正在使用的用户记录时 NHibernateSession.Saveentity//不会将用户对象立即保存到数据库。它被保存在会话中 当我想让用户登录时,我根据他的用户名加载用户,然后得到null user object 为什么我会得到一个空对象,如何使它工作 谢谢如果您的保存和获取是从不同的会话完成的,那么获取将返回nul

你好,

我正在使用nhibernate,在我的网站上注册用户时遇到问题

当用户想要注册时,我在数据库中创建新的用户记录,并且在系统登录用户之后立即创建

问题就在这里。。。创建我正在使用的用户记录时

NHibernateSession.Saveentity//不会将用户对象立即保存到数据库。它被保存在会话中

当我想让用户登录时,我根据他的用户名加载用户,然后得到null user object

为什么我会得到一个空对象,如何使它工作


谢谢

如果您的保存和获取是从不同的会话完成的,那么获取将返回null,因为对象在刷新之前只存在于其他会话内部缓存中


我不确定二级缓存是否会产生影响。如果在保存或刷新时写入二级缓存,我不确定。好的,我刚刚测试了以下内容:

        ISession session = s.CreateSession();

        User user = new User();

        user.Number = 122;
        user.UserName = "u";
        user.Id = 1;

        session.Save(user);
        User user1 = session.CreateCriteria<User>().Add(Restrictions.Eq("UserName", "u")).UniqueResult<User>();

        session.Flush();
首先从CreateCriteria执行选择,然后刷新插入。所以它什么也找不到

我还使用Get1进行了测试,它返回传递给Save方法的实体-不执行任何查询


仍然-既然实体就在那里,为什么要查询数据库


另外,您说您使用Get,然后说您想通过用户名加载-用户名是主键吗?Get尝试通过主键加载。

我进入调试模式,在save和Get上检查会话ID,它们是相同的。奇怪。。。必须进行一些测试,看看什么是合理的。从Ayende博客:Get通常会导致对数据库进行选择,但它会首先检查会话缓存和二级缓存,以首先获取值。我认为这意味着,如果你对同一个实体进行了一次保存并紧接着进行了另一次保存,它就不会命中数据库,但我还没有花时间进行测试。嗯。。你可能是对的,但我仍然不明白为什么在你有实体的时候调用get。是的,我认为需要更多的信息。尽管如此,既然你有实体,为什么要查询数据库?好吧,因为这一切都是与我的自定义asp.net成员资格提供商一起发生的。。。这是一个注册新用户的用例。。。注册新用户时,将其保存到数据库,并将Membership user对象返回到register控件。之后,控件立即调用成员资格提供程序的验证方法,只传递用户名和密码,以便验证用户是否登录。您使用该用户名和密码加载刚才保存的用户对象。它正在查询数据库,因为您不是在查询实体的id,而是在查询用户名/密码。NH必须去db。另一件听起来像“注册”和“验证”的事情应该是它们自己的工作单元包装在一个事务中,或者至少是一个刷新。