问题标签 [isession]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1210 浏览

nhibernate - 如何让 NHibernate ISession 缓存主键未检索到的实体

我的“用户”实体几乎总是通过用户名检索,而不是通过其整数代理键。因为用户名不是主键,这意味着ISession不会缓存它,而是重复命中数据库来获取相同的数据。

有什么办法可以配置 NHibernate 来让 ISession 缓存通过用户名检索的用户?

0 投票
2 回答
121 浏览

nhibernate - nhibernatelazyload 创建新的 isession

延迟加载时可以防止 nhibernate 创建新的 ISession 吗?如何?

更正:我的意思是新的 IDbConnections。我已经实现了自己的 DriverConnectionProvider 并且我看到它由于延迟加载而被调用

0 投票
1 回答
608 浏览

nhibernate - 休眠一个 isession 相同的 idbconnection

我有一些代码在同一个 ISession 上执行了 2 次 session.Get(id)。我可以看到 ISession 创建了 2 个 idbconnections。我想这是因为某种配置。我希望它在同一个 idbconnection 上进行提取。如何?

0 投票
2 回答
2537 浏览

repository - 在业务层中使用工作单元/存储库的正确方法是什么?

使用工作单元/存储库模式构建了一个小型应用程序后,我很难理解如何在我的业务层中正确使用它。我的应用程序有一个数据访问层,它可以是 NHibernate 或实体框架。我可以轻松地在这些之间切换。

我有许多存储库,例如 Customer、Order 等。我的工作单元将是 ISession 或 Object Context,具体取决于我要测试的 DAL。

我的业务层包含一个业务方法 - CreateOrder()。我正在努力理解的是我应该在业务层的哪个位置初始化我的工作单元和我的存储库。

专注于 Nhibernate,我的 DAL 看起来像:

在我的业务层中,我想知道我应该在哪里声明我的工作单元和存储库。它们是在类级别还是在 CreateOrder 方法中声明的?

例如:

上述代码仅适用于第一次调用 CreateOrder() 方法,但不适用于后续调用,因为会话已关闭。我尝试在提交事务后删除“context.Close()”调用,但这也失败了。尽管上述方法不起作用,但在此范围内声明我的存储库和工作单元对我来说似乎更正确。

但是,如果我按如下方式实现它,它可以正常工作,但是在方法本身的范围内声明存储库和工作单元似乎是不自然的。如果我有大量的业务方法,那么我将在各处声明存储库和工作单元:

如果我要使用类级别声明来实现这一点,那么我认为我需要一些方法来在 CreateOrder 方法的开头重新打开相同的工作单元。

在业务层中使用工作单元和存储库的正确方法是什么?

0 投票
1 回答
522 浏览

nhibernate - NHibernate 2.1.2 连接在 factory.OpenSession() 时打开?

当我打开一个会话时

var session = factory.OpenSession();

并检查 session.Connection.State 它是打开的。“连接”的类型是 SqlConnection。这意味着通过创建会话,连接会自动打开,我认为 NH 并非如此。在 NH 确定最佳冲水时间之前,不应该关闭它吗?我究竟做错了什么?

hibernate.cfg.xml:

0 投票
6 回答
4346 浏览

nhibernate - NHibernate ISession.Save() - 为什么这会立即持久化我的实体?

我正在使用 NHibernate 创建大量实体,将它们附加到我的 ISession,然后使用事务将我的更改提交到数据库。代码示例如下:

我的印象是_context.Save() 行只是让ISession 知道新实体,但是在我通过tx.Commit() 行刷新会话之前,不会对数据库进行任何更改。

不过,我观察到的是,每次我调用 _context.Save() 时,数据库都会获得一个新实体。结果,我最终对数据库进行了太多单独的调用。

有谁知道为什么 ISession.Save() 会自动持久化更改?我是否误解了 NHibernate 的行为方式?谢谢。

***编辑 - 只是为了澄清(根据两个建议的答案) - 我的问题是,一旦我调用 _context.Save(),数据库就会更新。我不希望发生这种情况。在调用 tx.Commit() 之前,我希望不会向数据库中插入任何内容。不幸的是,到目前为止,这两个建议的答案都没有帮助。

可以在此处找到有关身份生成器的一些有用信息

0 投票
1 回答
840 浏览

sql-server - 如何在流畅的休眠中创建与 SQL Server 的会话

创建与 SQL Server 的连接时出现异常。

ISession工厂如下所示,我从中得到了异常:

抛出以下异常:

查找 'd:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs' 的源。(无校验和。)
文件 'd:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs' 不存在。
在脚本文档中查找 'd:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs'...
在项目中查找 'd:\CSharp\NH\NH\nhibernate\src\NHibernate \Cfg\Configuration.cs'。
在项目中找不到该文件。
查看目录'C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\'...
查看目录'C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\'。 ..
查看目录'C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl\'...
查看目录 'C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\'...
活动解决方案的调试源文件设置表明调试器不会要求用户查找文件:
d: \CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs。
调试器找不到源文件 'd:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs'。

0 投票
1 回答
145 浏览

nhibernate - NHibernate 3,HttpModule 和错误

背景:

使用 HttpModule 创建带有 NH3 的 Web 应用程序的启动,以管理事务和会话的创建/提交/回滚。在发生错误的情况下,我想向用户返回一条简单的消息,但回滚事务。挂钩 context.Error 事件,允许在异常时轻松回滚,但是,由于正在捕获异常,因此永远不会调用它,向用户显示友好的消息。

由于上述问题,我将创建一个自定义工作单元场景,并将其存储在请求的 Http 上下文中。如果发生错误,请设置 RollbackRequired 标志,并让工作单元基于此执行回滚。将会话存储在 HttpContext 中 - 这与使用 CurrentSessionContext 相同吗?

如果有人有其他想法,我会很棒。

谢谢。

0 投票
2 回答
1183 浏览

c# - 难倒:自定义 NHibernate 会话管理给出“指定的强制转换无效”异常 (C#)

我试图在我的控制台应用程序中实现一些适当的 NHibernate 会话管理,但遇到了一些非常奇怪的问题。有那么一刻,一切似乎都运行良好,但随机地,当尝试获取似乎指向日期时间值的特定对象时,它突然开始抛出“指定的强制转换无效”异常,但没有更多信息是假如。

现在,我已经消除了我的映射出现任何问题的可能性,因为我只是简单地对除字符串字段和主键(这是一个 GUID)之外的所有字段进行了注释。尽管如此,异常仍然被抛出。此外,所讨论的对象不包含任何子对象。

相反,我怀疑我调用 Session 的方式有问题,所以 Session 的缓存中有一些东西由于某种模糊的原因导致了这个问题。

我使用这个 Util 类来管理会话:

因此,在 DataObjectManager 类的每个操作开始时,我从一个继承自超类的通用方法获取会话,该方法获取会话,如下所示:

当控制台应用程序(或单元测试)的一次扫描中的所有操作都完成后,我确保调用了 DisposeCurrentSession 方法。

有什么可以改进的地方可以防止这些异常的发生吗?


编辑

这是堆栈跟踪:

以及它发生的方法:


编辑2:

我得到一个线索,那就是在获取对象时自动刷新会话时会发生这种情况。所以看起来错误发生在早期事务中驻留在会话中但尚未刷新的对象上。所以这个问题潜伏在会话中,直到它再次被使用。

0 投票
1 回答
293 浏览

nhibernate - 我们是否应该在 Nhibernate ISession 之上使用我们自己的工作单元

我刚开始学习温莎城堡。有一个关于我是否应该在 Nhibernate ISession 之上添加另一个工作单元的问题。

我在温莎教程中找到了这个。

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx

“我们刚刚所做的事情有一个重要的,虽然不可见的影响。通过注册组件,我们不仅告诉温莎如何创建它们。温莎还将为我们妥善销毁实例,从而管理它们的全部生命周期。通俗地说,Windsor 将在不再使用这两个对象时将其销毁。这意味着它将为我们刷新我们对 ISession 所做的更改到数据库,并清理 ISessionFactory。我们得到了所有这些免费。 ”

听起来我们不需要将更改提交到数据库,Windsor 会处理这些。我假设 Windsor 会在页面关闭或完全加载后执行此操作。

现在我看到其他人像这样在 Nhibrenate 之上添加另一个工作单元。

只是好奇哪一个被认为是最佳实践?