- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个名为“Customer”的类,并且在该类上有一个方法是有意义的:
void AddOrder(Item item, int quantity, decimal pricePerUnit)
AddOrder 方法在概念上会在数据库中创建新记录。
从 C# 的角度来看,上面的方法签名没有问题,但出于 NHibernate 的目的,它需要访问 ISession 以将新对象保存到数据库中。
在不使我的持久类上的每个方法都具有 ISession 参数的情况下,实现此目标的适当模式是什么?
我是否应该使用依赖注入(inject)从接收当前 ISession 实例的公共(public)抽象祖先继承我的持久类? (即为 ISession 实现一个瘦包装器,充当处理所有创建或获取请求的对象工厂)
有好的模式吗?
PS - 我知道我不想使用存储库模式。对于高度复杂的数据模型来说,它的形式过于自由。
澄清:
所讨论的数据模型是一个复式记账系统。大多数开发人员对复式记账机制的了解为零,他们也不想这样做。因此,我想做的是提供代码方法,向开发人员指示“我可以用这个对象做什么?”,而不是仅使用属性,这是正常的 NHibernate 方式。 p>
我现在已经在相当多的项目中使用了 NHibernate,我不断地得出结论,我真的应该将非常复杂的系统的所有数据交互都放在一个高度结构化的 API 后面,并且只有那些从事此工作的人该 API 的后端应该是数据/持久性模型方面的专家。只与数据交互的程序员只知道如何使用 API。这不是我真正想得出的结论,因为它会给我们的一些系统增加相当多的开发开销。 (当然,这是通向面向服务的架构的途径,现在对于大型项目来说可能只是“给定的”)
最佳答案
如果 Customer
是一个持久类,您将不需要访问 session 对象来添加新的 Item
记录。客户需要将集合属性 Items
映射为“具有多对多”关联,并将级联映射选项设置为“保存”或“全部”。
AddItem()
方法应该简单地将一个 Item
实例添加到 Customer
对象的 Items
集合中.一旦您提交了 NHibernate 事务(通常在操作过滤器、http 模块或其他一些基础设施类中完成),NHibernate 将保存所有记录。
如果Customer
是新实例化的类,您将必须调用当前ISession
实例的Save
方法。您还必须调用 Remove
方法来删除持久对象。
我通常会创建一个非常通用的简单 DAO 服务来添加/删除/获取 id 聚合根。级联和获取路径负责处理关联的对象。对于复杂的查询,您可以创建通过依赖注入(inject)访问 ISession
实例的查询对象。
编辑:听起来您希望对象立即保留。我建议保持事务简短而不是手动引用和刷新 session 。虽然以后可以正确地做到这一点,但通常您会失去很多 ORM 数据完整性的好处。
关于c# - 逻辑链接对象的 NHibernate 模式,无需到处传递 ISession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27002596/
在 NHibernate 3.1 中,ISession.SaveOrUpdateCopy()已被标记为已弃用。文档建议使用 Merge()反而。每个文件的文档如下: SaveOrUpdateCopy(
我是 WCF 和 NHibernate 的初学者。 但是,我必须做一个涉及多个服务(使用 WCF 制作)和一个持久层(使用 NHibernate 制作)的小项目。 我的问题涉及 ISession 和
我注意到,通过使用 log4net,在调用 ISession.Update 时,它会更新所有已更改的对象。 例如: // Change 2 instances user1.IsDeleted =
我正在使用 NHibernate 创建大量实体,将它们附加到我的 ISession,然后使用事务将我的更改提交到数据库。代码示例如下: ISession _context = SessionProvi
我正在使用 NHibernate 和 Rhinomocks 并且无法测试我想要的内容。我想在不访问数据库的情况下测试以下存储库方法(其中 _session 作为 ISession 注入(inject)
在 NHibernate 中使用 IStatelessSession 与使用 ISession 相比有何优缺点? 最佳答案 StatelessSession 不跟踪对实体所做的更改,并且不支持延迟加载
我已将 NHibernate session 包装在我自己的 IDataContext 中。我的 NHibernate 实现如下: public class NHibernateDataContext
您将如何解决以下情况:该应用程序基于 MVP (WinForms),同时我可以让多个演示者展示。每个演示者都有一个附加的 session ,并在演示者的生命周期内打开。 如果我在一个演示器中加载一个实
当我尝试编译以下代码时 using System; using System.Collections.Generic; using System.Reflection; using System.Li
我正在 Windows Azure 中构建一个辅助角色,用于计算数据和更新各种 API。 为了获得最佳性能,我的 NHhibernate session 应该采用什么LifeStyle? (我将 Ca
我有以下代码,我尝试 stub ISession.Query() . var unitList = new List() { new UnitM
NHibernate 的 ISession 公开了一个具有两个重载的方法 Persist()。我在任何地方都找不到有关此方法的文档。在 http://nhibernate.info/doc/nh/en
我有一个我想使用 NHibernate 插入/更新到数据库的 10 个数据对象的列表。如果一个抛出异常(比如主键冲突),我仍然想插入/更新另一个 9. 我将每个对象操作滚动到它自己的原子事务中,如果有
关于 Autofac 如何帮助管理 NHibernate ISession 实例(对于 ASP.NET MVC 应用程序),是否有人有任何提示或最佳实践? 最佳答案 我不太熟悉应该如何处理 NHibe
让我彻底困惑的一件事是 session.Flush 的使用,与 session.Commit 结合使用,和session.Close . 有时session.Close有效,例如,它提交了我需要的所有
这是我的问题:我正在使用以下工具构建一个桌面应用程序: 卡利本 忍者 NHibernate 我所有的 View 模型和存储库都是用 Ninject 实例化的。我的存储库都需要在其构造函数中使用 ISe
考虑一个每个 View 的事务模型,其中使用 IHttpModule 我使用标准 ISession 打开一个事务。 现在,我有一个页面,我想在其中进行一些批处理操作。由于 IStatelessSess
我试图避免使用内存数据库进行测试(尽管如果以下情况不可能,我可能不得不这样做)。我在 LINQ 中使用 NHibernate 3.0。我希望能够模拟 session.Query()返回一些虚拟值,但我
我对 FNH 和 NH 世界还很陌生,所以要温和 :P 我创建了一个使用 FNH 进行数据访问的应用程序,它在不使用延迟加载的情况下运行良好,但是一旦我启用延迟加载,一切都会变成梨形(例如,当我尝试访
假设我有一个名为“Customer”的类,并且在该类上有一个方法是有意义的: void AddOrder(Item item, int quantity, decimal pricePerUnit)
我是一名优秀的程序员,十分优秀!