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

时间:2014-08-08 11:49:59

标签: c# nhibernate mapping multiple-columns

我遇到了一个问题,我甚至无法找到合适的Google关键字。

有2个数据库。在第一个中有一个表" Item"有2列"描述A","描述B"。在第二个数据库中,我还有一个名为" Item"但是,如果列名略有不同,请说:" Description_A"和" Description_B"。

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

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

解决此类问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

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

因为,如上所述,我们正在谈论 2 DB。这意味着,我们需要 2 NHiberante ISession工厂,其中(每个)将通过不同的{{1}与这些数据库中的一个进行交互}。

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

第一个看起来像这样:

connection strings

虽然第二个会像这样配置

<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> 的信息(MyProject.Data可以包含那些{{1}两个模式都相同的文件)

那就是说,我们需要两个Embedded Resources项目/库,

  1. 一个具有DB1架构和
  2. 的映射
  3. 使用DB2模式映射的
  4. C#实体以及任何业务逻辑将被共享。甚至一些 DAO 对象也可以共享......只是每个数据库交互都会使用不同的映射

    必要注意:不要忘记将任何.hbm.xml文件标记为嵌入资源 - 每个文件。