如何使用 NHibernate 处理应用程序中的默认数据
Posted
技术标签:
【中文标题】如何使用 NHibernate 处理应用程序中的默认数据【英文标题】:How to handle default data in an application using NHibernate 【发布时间】:2010-11-04 16:15:59 【问题描述】:我正在开发一个使用 SQL Server 和 NHibernate 的应用程序。我们有需要为每个新实体创建的默认数据(复杂实体)的概念。可以根据每个用户更改此数据。但是,我们正在努力寻找创建这些数据的最佳方式。
例如,假设我的应用程序有一个Store
实体,它有几个默认的Product
s,我想在创建新的Store
时创建它们。每个Store
的管理员都可以修改关于aProduct
的任何内容。
在我看来,有两个主要选择:
-
在代码中保留默认数据,并在创建新实体后将其写入数据库。
在数据库中保留默认数据,并在创建实体时使用存储过程/原始 SQL 将其移动。
出于本能,我倾向于选项二,因为数据库擅长移动和操作数据集,而选项一需要大量可能会失控的混乱代码。
但是,编写存储过程或原始 SQL 会带来一些问题:
我们必须根据使用的数据库重写存储过程或 SQL 我们会以某种方式颠覆 ORM(不确定这是否真的是错误的)。也就是说,我们将在不使用 NHibernate 的情况下移动数据我发现 Ayende Rahien 的 this 文章概述了如何执行批量删除。我认为为插入默认数据做类似的事情会很好。我还发现了一个描述类似情况的 nhibernate 用户组帖子(称为“架构导出和默认数据”--所以不会让我发布两个链接),但似乎没有就正确的解决方案达成共识是(尽管 Ayende 确实提供了一些反馈并建议数据存在于数据库中)。
写完这篇文章后,我更倾向于使用存储过程,我只是担心混合两种数据库访问策略(直接调用 SProcs 和使用 ORM)可能会出现陷阱。
感谢任何反馈!
编辑:删除“不可变”语言。我专门讨论的是可以更改的默认数据,所以我认为这个术语在这里不正确/令人困惑。
【问题讨论】:
你能澄清一下吗?您实际上是否将这些对象映射为不可变的?如果是这样,请参阅这篇(有点骇人听闻的)文章,了解如何颠覆它,它可能适用于您的场景:jameskovacs.com/2007/11/04/… 在任何一种情况下,您可以发布您的映射吗?我认为这会有所帮助... 我更新了原始帖子——我的意思是更多的“默认”数据,这些数据原本对于所有实体都是相同的,但随后可以根据每个实体进行更改。 在这种情况下...看看:fabiomaulo.blogspot.com/2009/05/… - 可以单独使用 hql 进行插入和更新... @DanP:该链接非常有用,但看起来这些示例使用了从包含一种 NH 实体类型的表到另一种类型的批量插入。我不一定将默认数据视为域问题(至少并不总是如此),因此我会犹豫创建单独的“默认”NH 实体和“可编辑”NH 实体。也许这是要走的路。 @Andrew:我相信您也可以从参数中插入值(而不是从其他映射表中选择);您不能只指定要插入基础设施层某处的默认数据吗?我认为您的目标是使其独立于数据库,而可执行的 hql 将实现这一点。 【参考方案1】:我将创建一个在代码中创建这些数据的默认数据服务,并使用工厂来创建您的商店并使用默认数据服务来生成默认实体。 使用存储过程肯定会破坏拥有 ORM 的意义。
【讨论】:
以上是关于如何使用 NHibernate 处理应用程序中的默认数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Fluent 设置 NHibernate.Burrow?
Castle ActiveRecord / NHibernate - 密码加密或散列