我遇到了一个问题,我甚至无法找到合适的Google关键字。
有2个数据库。在第一个中有一个表" Item"有2列"描述A","描述B"。在第二个数据库中,我还有一个名为" Item"但是,如果列名略有不同,请说:" Description_A"和" Description_B"。
我的问题是:是否可以在一个映射文件和一个c#-class中创建一个hibernate映射?例如,映射反应类似于"如果我找不到列DescriptionA,那么我将只读/写列Description_A!"?
我不想做的是创建2个映射和c#类,因为这意味着2创建2个非常相似的c#类和映射文件,这会导致非常大的代码冗余。
解决此类问题的最佳方法是什么?
答案 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
项目/库,
C#实体以及任何业务逻辑将被共享。甚至一些 DAO 对象也可以共享......只是每个数据库交互都会使用不同的映射
必要注意:不要忘记将任何.hbm.xml
文件标记为嵌入资源 - 每个文件。