我是nHibernate和Fluent nHibernate的新手,我在一些简单的设置上遇到了很多麻烦。
private static ISessionFactory CreateSessionFactory()
{
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(
FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(@"MultipleActiveResultSets=True;Data Source=.\SQLEXPRESS;Initial Catalog=nHibernate;Integrated Security=True;Pooling=False"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private static void BuildSchema(NHibernate.Cfg.Configuration config)
{
// this NHibernate tool takes a configuration (with mapping info in)
// and exports a database schema from it
new SchemaExport(config)
.Drop(false, true);
new SchemaExport(config)
.Create(false, true);
}
此方法(部分来自他们自己的样本)创建数据库。这一切都很好,很好......
但我的数据库中有多个模式,例如..
dbo
。
Sheets.Traits
表格是一种模式。所以在SheetsMap
课上,我有......
public class SheetMap : ClassMap<Sheet>
{
public SheetMap()
{
Id(x => x.Id);
HasManyToMany(x => x.Traits)
.ParentKeyColumn("Sheet")
.ChildKeyColumn("Trait")
.Cascade.All()
.Schema("Sheets")
.Table("Traits");
Table("Sheets");
}
}
但是这会在运行时抛出错误。我应该怎么做?我真的不理解这一切应该如何工作的99%。
我收到的错误是......
An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
{"The specified schema name \"Sheets\" either does not exist or you do not have permission to use it."}
基本上,我需要知道如何让构建器在执行脚本时创建此模式。我确信这就是问题所在。
答案 0 :(得分:3)
NHibernate不会创建数据库,也不会创建模式;只有表和关系。
在使用SchemaExport之前创建所有模式。
答案 1 :(得分:1)
您可以尝试这种“手动干预”。
这段代码最终让我进入了Catch22。
但这是一种可能的解决方法,具体取决于您的数据库是“预先存在”还是全新导出(导致我相信的catch22情况)。
using (ISession sess = SomeCodeToGetASessionNotShownHere())
{
List<string> schemas = new List<string>();
schemas.Add("MySchema");
// SchemaExport won't create the database schemas for us
foreach (string schema in schemas)
{
string sql = string.Format(System.Globalization.CultureInfo.InvariantCulture, "if not exists(select 1 from information_schema.schemata where schema_name='{0}') BEGIN EXEC ('CREATE SCHEMA {0} AUTHORIZATION dbo;') END", schema);
sess.CreateSQLQuery(sql).ExecuteUpdate();
}
}
上面的代码,我(在我的原型生活中的某个时刻)放置了以下两个陈述:
//drop database
new SchemaExport(cfg).Drop(true, true);
//All the schema-creation Code (from above) goes HERE
//re-create database
new SchemaExport(cfg).Create(true, true);
但就像我说的那样,它可能会产生一个Catch22。