2010-10-12 4 views
1

Я новичок в nHibernate и Fluent 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."} 

В принципе, мне нужно знать, как иметь строитель создать эту схему, когда он делает сценарий. Я уверен, в этом проблема.

ответ

3

NHibernate не создает базы данных или схемы; только таблицы и отношения.

Создайте все схемы перед использованием SchemaExport.

+0

Я пробовал это. Он бросает их. – Ciel

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(); 
      } 
     } 

код выше, я (в какой-то момент в моей жизни прототипирования), помещенного между 2 заявления ниже:

 //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.

Смежные вопросы