从单独的数据库中获取实体的只读集合

时间:2013-10-09 22:27:10

标签: nhibernate

我正在构建一个新的NHibernate 3.3应用程序,它必须连接到遗留系统才能查找有关我的用户的一些信息。有一个单独的,只读的数据库,用于保存课程注册,我希望用它来填充我的Student实体上的集合。这些将是NHibernate所说的组件,包括部门代码,课程和部分编号,如“MTH101 sec.2”

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

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

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

1 个答案:

答案 0 :(得分:0)

两个选项

如果您有多个数据库或多个数据库服务器,您尝试使用NHibernate在单个域模型中链接在一起,那么您基本上有两个选项。

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

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

    可用功能

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

    Cross-DB where条款

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

    非强迫关系

    不会有任何外键强制执行该关系,因为数据存在于两个不同的数据库中。 NHibernate(非常合理地)假设数据库关系是由外键强制执行的。由于这两个数据库可能不同步,#1将要求您使用not-found="ignore"performance implications。{/ p>

    部署的复杂性

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

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