使用Fluent nHibernate生成多个模式

时间:2010-10-12 00:05:08

标签: c# nhibernate fluent-nhibernate

我是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."}

基本上,我需要知道如何让构建器在执行脚本时创建此模式。我确信这就是问题所在。

2 个答案:

答案 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。