代码之家  ›  专栏  ›  技术社区  ›  Luke101

如何将NHibernate与几个数据库和表一起使用

  •  1
  • Luke101  · 技术社区  · 13 年前

    我是NHibernate的新手,如果这只是一个简单的问题,我很抱歉。基本上,我有一个数据库,其中包含对其他数据库的访问。这是我的基本数据库的布局。这是一个包含其他数据库的数据库信息的表

    --Databases--
    Id
    DatabaseName
    DatabaseType
    ConnectionString
    

    如您所见,此表包含所有维护的数据库。现在,这里有一个表,其中包含链接到数据库的所有列。

    --Tables--
    Id
    Name
    ColumnNames
    DatabaseId
    

    我有许多不同类型的数据库,包括(Oracle、mysql、mssql或postgresql)。他们在我的应用程序中扮演着不同的角色。为每个数据库中的每个表创建映射xml文件将非常耗时。

    我想将连接字符串传递给nhibernate,并对该表执行一个简单的查询。下面是一个查询示例。

    select * from table90182763 where id IS not NULL and id <> 0
    

    我可以直接将此SQL查询传递给NHibernate吗? 我能在每次请求时有效地将连接字符串传递给nhibernate吗?

    1 回复  |  直到 13 年前
        1
  •  2
  •   David C    13 年前

    您可以使用session.CreateSQLQuery(),但它在您的场景中有一个缺点。

    为了使用CreateSQLQuery,您需要为每个数据库都有一个会话管理器,根据结果构建域实体的映射文件和类,等等。。。

    NHibernate映射到实体,所以如果您想编写原始SQL并返回结果的数据表,只需使用标准的ODBC驱动程序并按照旧的方式进行操作。

    NHibernate使开发和维护变得更快、更容易,如果您想在未来快速维护和添加新功能,就应该正确使用它。

    正如强大的克雷格·奎伦(Craig Quillen)所说,“如果这是合法的基础设施,并且可以节省你的时间和失眠的夜晚,那么这是一个很好的投资回报率”。

    您可以设置NHibernate来访问任意数量的数据库,使用任意数量的数据引擎类型。您还可以使用IoC容器对数据库会话进行抽象,使其几乎透明。

    您应该使用代码配置( example here )创建几个会话工厂,每个工厂都有自己的ConnectionString、Dialect和Driver。这些将被创建为静态或“按需IoC”单体。然后,根据您需要加载的实体,您的IoC工厂可以从正确的NHibernate会话工厂请求会话。

    为了以自动方式直接从数据库表生成映射文件和实体,请使用类似于以下内容的工具: http://nmg.codeplex.com/