0

我正在构建一个新的 NHibernate 3.3 应用程序,它必须连接到旧系统才能查找有关我的用户的一些信息。有一个单独的只读数据库,其中包含我想用来填充我的学生实体上的集合的课程注册。这些将是 NHibernate 语言中的组件,由部门代码、课程和节号组成,例如“MTH101 sec. 2”

外部数据库有一个代理键,即学号,它对应于我的用户实体中的一个属性,但它不是学生的主键。

这些数据库位于不同的服务器上。我无法更改旧数据库,

我是否希望将注册集合映射为 NHibernate 组件?

4

1 回答 1

0

两种选择

当您有多个数据库或多个数据库服务器尝试使用 NHibernate 在单个域模型中链接在一起时,您基本上有两种选择。

  1. 利用数据库服务器的功能(链接服务器等)来连接数据,这样 NHibernate 只需担心连接到一个数据库。在您的 NHibernate 映射中,您完全指定table属性,以便数据库服务器知道要查询其他数据库服务器。对于您的“代理键,...不是主键”,您可以使用<many-to-one property-ref="...">.
  2. 使用多个 NHibernate 会话工厂,每个数据库一个。您将负责协调从哪个数据库加载的内容。您只需为该数据库中存在的表和适当的连接字符串配置每个会话工厂。然后,为了加载数据,您执行两个查询,一个针对一个数据库,另一个针对另一个数据库。

哪一个?

哪个是正确的选择?这取决于...

可用功能

如果您的数据库服务器没有任何功能支持#1,或者如果有其他因素阻止您使用这些功能,那么您显然必须使用#2。

跨数据库where子句

#1 在编写查询时为您提供了更大的灵活性 - 如果需要,您可以指定where跨越两个数据库的子句,但您需要注意您编写的查询不需要数据库 A 从数据库 B 获取大量数据。方法 #2 您执行第二个查询以从数据库 B 中获取所需的内容,这迫使您更加清楚必须从每个数据库中获取哪些数据才能完成工作。

非强制关系

因为数据存在于两个不同的数据库中,所以不会有任何外键来执行这种关系。NHibernate(非常合理地)假设数据库关系是由外键强制执行的。由于这两个数据库有可能不同步,#1 将要求您诉诸诸如 之类的东西not-found="ignore",这会影响性能

部署的复杂性

数据库间的关系使部署到各种环境(DEV、QA、PROD)变得困难。您不能只部署应用程序和数据库,并确保应用程序的连接字符串指向正确的数据库;相反,您还必须确保数据库内对其他数据库的任何引用都指向正确的位置。

考虑到上述所有因素,我通常倾向于选项#2,但在某些情况下,#1 更方便。

于 2013-10-10T15:34:12.737 回答