NHibernate Как указать пользовательский тип SQL только в производстве - PullRequest
2 голосов
/ 13 мая 2010

Я сохраняю двоичные файлы в Sql Server 2005 Db, используя Fluent NHibernate. Однако я использую SQLite для запуска моих (псевдо) модульных тестов.

Мне нужно использовать пользовательский тип Sql для Ms Sql, но это приведет к ошибке на SqlLite. Какие стратегии я могу использовать?

Это файл карты:

public class BinaryFile
 {   
 public BinaryFile()
    {         
        m.Map(x => x.BinaryData);//.CustomSqlType("varbinary(MAX)");
        m.Map(x => x.ContentType);
        m.Map(x => x.FileName);
        m.Map(x => x.FileSize);
    }
 }

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Не могли бы вы использовать разные классы ClassMap для каждой конфигурации? Возможно, вам придется явно добавить каждый ClassMap в конфигурацию сеанса Fluent, что сделает его более многословным, но это будет означать, что вы можете использовать другой класс отображения для разных баз данных.

public class BinaryFileMSSqlServer
{   
    public BinaryFile()
    {         
        m.Map(x => x.BinaryData).CustomSqlType("varbinary(MAX)");
        m.Map(x => x.ContentType);
        m.Map(x => x.FileName);
        m.Map(x => x.FileSize);
    }
}

public class BinaryFileSQLite
{   
    public BinaryFile()
    {         
        m.Map(x => x.BinaryData);
        m.Map(x => x.ContentType);
        m.Map(x => x.FileName);
        m.Map(x => x.FileSize);
    }
}

Ваше беглое отображение сеанса будет выглядеть примерно так:

Fluently.Configure()
  .Database(MsSqlConfiguration.MsSql2005
    .ConnectionString(c => c
      .FromAppSetting("connectionString"))
    .Cache(c => c
      .UseQueryCache()
      .ProviderClass<HashtableCacheProvider>())
    .ShowSql())
  .Mappings(m => m.FluentMappings
      .Add<BinaryFileMSSqlServer>()
      .Add<...>()
      .Add<...>())
  .BuildSessionFactory();

Вам необходимо заполнить каждый из ваших классов сопоставления вручную. Вам также необходимо создать отдельную свободную конфигурацию для SQLite, используя, где это необходимо, специальные классы SQLite.

1 голос
/ 13 мая 2010

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

 #if DEBUG          
          m.Map(x => x.BinaryData);
 #else
        //Map production here           
 #endif
...