Nhibernate 获取一个实体';s从单独数据库中的只读集合

Nhibernate 获取一个实体';s从单独数据库中的只读集合,nhibernate,Nhibernate,我正在构建一个新的NHibernate 3.3应用程序,它必须连接到一个遗留系统,以便查找有关我的用户的一些信息。有一个单独的只读数据库,保存课程注册,我想用它来填充学生实体上的集合。这些将是NHibernate speak中的组件,由部门代码、课程和章节号组成,如“MTH101第2节” 外部数据库有一个代理键,即student number,它对应于我的用户实体中的一个属性,但它不是student的主键 这些数据库位于不同的服务器上。我无法更改旧数据库 我是否希望将注册集合映射为NHibern

我正在构建一个新的NHibernate 3.3应用程序,它必须连接到一个遗留系统,以便查找有关我的用户的一些信息。有一个单独的只读数据库,保存课程注册,我想用它来填充学生实体上的集合。这些将是NHibernate speak中的组件,由部门代码、课程和章节号组成,如“MTH101第2节”

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

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

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

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

  • 利用数据库服务器的功能(,等等)加入数据,这样NHibernate只需担心连接到一个数据库。在NHibernate映射中,完全指定
    属性,以便数据库服务器知道如何查询其他数据库服务器。对于“代理键,……不是主键”,您可以使用
    映射它
  • 使用多个NHibernate会话工厂,每个数据库一个。您将负责协调从哪个数据库加载的内容。您可以仅为该数据库中存在的表配置每个会话工厂,并使用适当的连接字符串。然后,要加载数据,需要执行两个查询,一个针对一个数据库,另一个针对另一个数据库
  • 哪一个? 哪个是正确的选择?这取决于

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

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

    非强迫关系 不会有任何外键强制执行关系,因为数据位于两个不同的数据库中。NHibernate(非常合理)假设数据库关系由外键强制执行。由于这两个数据库有可能不同步,因此#1将要求您采取类似于
    not found=“ignore”
    的措施,这已经发生了

    部署的复杂性 数据库间的关系使部署到各种环境(开发、质量保证、产品)变得困难。您不能只部署应用程序和数据库,并确保应用程序的连接字符串指向正确的数据库;相反,您还必须确保数据库中对其他数据库的任何引用都指向正确的位置


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

    我猜,您将需要另一个
    sessionFactory
    配置到Legance数据库。