我有一个应用程序与两个数据库交谈,它运行得很好,我的测试通过了,除了当它试图导出当前DB模式时,它在一个块中输出两个DB的所有内容,当它试图验证对象模型/DB模式时,它试图在一个数据库中查找一切,当一个类(这是外部数据,因此外部DB)不应该被映射。我为类提供了一个映射覆盖,以便NH可以正确地从外部DB(它是只读的)加载/使用数据,但是现在当我导出我的模式时,它会尝试制作那个表。
我尝试了IgnoreBase(typeof(Unit))
,但这没有效果(而IgnoreBase(typeof(Entity))
确实正常工作)。我已经用[SessionFactory(DataGlobals.FOREIGN_DB_FACTORY_KEY)]
装饰了自定义存储库方法,其中简单地定义了一个常量字符串用作SessionFactory
的键,但我确信如果有什么我需要装饰类(Unit
)或传递不同的参数给SchemaExport
…
public void CanGenerateDatabaseSchema(){
var session = NHibernateSession.GetDefaultSessionFactory().OpenSession();
using (TextWriter stringWriter = new StreamWriter("../../../../db/schema/UnitTestGeneratedSchema.sql"))
{
new SchemaExport(configuration).Execute(true, false, false, session.Connection, stringWriter);
}
}
public void CanConfirmDatabaseMatchesMappings()
{
var allClassMetadata = NHibernateSession.GetDefaultSessionFactory().GetAllClassMetadata();
foreach (var entry in allClassMetadata)
{
NHibernateSession.Current.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco))
.SetMaxResults(0).List();
}
}
在Fluent NHibernate中,您可以使用SchemaAction.None
来禁用特定表的模式生成。
例子:
public class BankInfoMap : ClassMap<BankInfo>
{
public BankInfoMap()
{
Schema(“viplookups.dbo”);
Table(“bnkroute”);
SchemaAction.None();
Id(x => x.Id).Column(“bnkrouteid”);
Map(x => x.AbaNumber).Column(“crouting”);
Map(x => x.Name).Column(“ccompname”);
Map(x => x.City).Column(“ccity”);
Map(x => x.State).Column(“cstate”);
Map(x => x.PhoneNumber).Column(“cphone1″);
}
}
摘自:http://lostechies.com/rodpaddock/2010/06/29/using-fluent-nhibernate-with-legacy-databases/