【发布时间】:2016-03-16 16:25:18
【问题描述】:
目前我有两个结构相同的数据库(一个用于临时更改,另一个用于实时更改)。我使用相同的 NHibernate 实体、映射和存储库来访问这两个数据库。创建Session时仅更改连接字符串。
现在我需要改变方法并将这两个数据库合并为一个。我计划通过为它们引入不同的模式来分离同名的表。听起来很容易。但是当我检查如何更新我的 NHibernate 映射以使它们支持一种或另一种模式时出现了问题 - 似乎映射类仅支持无参数构造函数(至少所有将映射添加到 NHibernate 配置的方法都不假设任何构造函数参数)。
这里有一些示例代码来演示我想要实现的目标:
public class MyEntityMap : ClassMap<MyEntity>
{
public MyEntityMap ()
{
Table("MyEntities");
Schema("a"); //I can specify schema as a constant here, but I need it to be variable: constructor either parameter or changable in other way
Id(x => x.Id, "Id");
Map(x => x.Name, "Name").Length(100);
}
}
在创建 NHibernate 配置时,有以下选项可以添加映射(三个方法调用仅用于选项,我目前使用单个调用 AddFromAssemblyOf):
Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString("MyConnectionString"))
.Mappings(m => m.FluentMappings.AddFromAssembly(typeof (MyEntityMap).Assembly))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyEntityMap>())
.Mappings(m => m.FluentMappings.Add<MyEntityMap>)
显然,这两个选项都不支持ClassMap 派生类的参数化构造函数,而且我看不出如何同时为所有映射指定架构。
我看到的解决方案(但似乎有点矫枉过正):
- 从每个映射类手动创建 2 个派生类,并将它们放置在不同的程序集中。这样每个类都可以为模式常量提供它的值。
- 自动生成 2 个映射类,使用
System.Emit从每个“基本”映射派生。使用在运行时生成的程序集传递给AddMappingFromAssembly方法。
我错过了什么吗? 是否有一种简单的方法来指定使用指定 NHibernate 配置创建的所有存储库的架构?
【问题讨论】:
-
也许答案是使用约定,我从未将它们与 NHibernate 代码映射一起使用。看这里fabiomaulo.blogspot.mx/2011/07/…
-
MsSql2008Configuration:看起来像是特定于您的代码的自定义类。我猜它确实继承自NHibernate.Cfg.Configuration,不是吗? -
@Frédéric,你是对的。替换的代码,依赖于我们的自定义数据层和相应的纯 FluentNHibernate 配置代码。
-
既然回答您的实际需求的内容与您的问题不符,也许您应该edit 并在其中添加一些注意事项(或者甚至改写您的问题,尤其是它的标题)。这将有助于找到这个问题和答案并对其他人有用。
-
@Frédéric,虽然答案与我的预期出人意料地不同,但我相信这个问题反映了我想要得到的东西,因此可以搜索。我稍微改写了一下,使其更笼统
标签: c# nhibernate