NHibernate映射-一个映射文件和c#类中的2个逻辑表中的2个不同的列

本文关键字:2个 映射 文件 一个 NHibernate | 更新日期: 2023-09-27 18:17:01

我有一个问题,我甚至找不到正确的谷歌关键字。

有2个数据库。在第一个示例中,有一个名为"Item"的表,包含两列"DescriptionA"、"DescriptionB"。在第二个数据库中,我也有一个名为"Item"的表,但列名略有不同,我们说:"Description_A"answers"Description_B"。

我的问题是:是否有可能在一个映射文件和一个c#类中创建一个hibernate映射?例如,一个映射反应像"如果我找不到列DescriptionA,那么我将只是读/写列Description_A!"?

我不想做的是创建两个映射类和c#类,因为这意味着创建两个非常相似的c#类和映射文件,这会导致非常大的代码冗余。

解决这个问题的最好方法是什么?

NHibernate映射-一个映射文件和c#类中的2个逻辑表中的2个不同的列

解决方案,内置NHibernate,是ISessionFactory配置。必须映射所有不同的实体两次,但在运行时只使用一个映射-每个连接字符串。

因为,如上所述,我们正在讨论2 DB。这意味着,我们将需要2 nhibernate ISession工厂,其中(它们中的每个)将通过不同的connection strings与这些DB中的一个交互。

因此,我们将为每个应用程序提供不同的配置,如这里所示:

  • 1.1。NHibernate入门

第一个可以像这样:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.connection_string">Server=DB1...
        ...
        <mapping assembly="MyProject.Data" />
        <mapping assembly="MyProject.DataForDB1" />
    </session-factory>

而第二个则有这样的配置

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.connection_string">Server=DB2...
        ...
        <mapping assembly="MyProject.Data" />
        <mapping assembly="MyProject.DataForDB2" />
    </session-factory>

区别不仅在于连接字符串…还包括映射文件 Embedded Resources 的信息(MyProject。数据可以包含两个模式相同的.hbm.xml文件)

也就是说,我们需要两个Data项目/库,
  1. 与DB1模式和
  2. 的映射
  3. 具有DB2模式映射的

c# 实体以及任何业务逻辑将被共享。甚至一些DAO对象也可以被共享…只是每个DB交互将使用不同的映射

重要提示:不要忘记将任何.hbm.xml文件标记为嵌入式资源 -每个文件