Я мог бы создать схему с помощью NHibernate, проблема в том, что NHibernate сначала создает таблицы, а затем вспомогательные объекты, в данном случае схемы.А поскольку таблицы используют схемы, а они не созданы, конфигурация будет разрушена.
Это конфигурация
public SessionFactory InitializeSessionFactory(string connectionString)
{
FluentConfiguration fluentConfiguration = Fluently.Configure();
fluentConfiguration
.Database(MsSqlConfiguration.MsSql2012.Dialect<MsSql2012Dialect>().ConnectionString(connectionString));
fluentConfiguration
.ExposeConfiguration((config) =>
{
config.AddAuxiliaryDatabaseObject(new CreateSchema("mySchema"));
new SchemaExport(config).Create(false, true);
});
fluentConfiguration
.Mappings(....);
ISessionFactory sessionFactory = fluentConfiguration
.BuildConfiguration()
.BuildSessionFactory();
return sessionFactory ;
}
Это вспомогательный объект
public class CreateSchema : AbstractAuxiliaryDatabaseObject
{
string _schemaName;
public CreateSchema(string name) { _schemaName = name; }
public override string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema)
{
return $"CREATE SCHEMA {_schemaName }";
}
public override string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema)
{
return $"DROP SCHEMA {_schemaName }";
}
}
Вот как я это использую.
public class EntityOverride : IAutoMappingOverride<Entity>
{
void IAutoMappingOverride<Entity>.Override(AutoMapping<Entity> mapping)
{
mapping.Schema("mySchema");
}
}
Я выбрал другой подход.Я создаю схемы через SqlCommand при инициализации приложения, а затем просто использую схемы.
Вот как я это делаю
public sealed class SqlSchemaCreator
{
private static Lazy<SqlSchemaCreator> _instance = new Lazy<SqlSchemaCreator>(() => new SqlSchemaCreator());
public static SqlSchemaCreator Instance { get => _instance.Value; }
private SqlSchemaCreator()
{
}
public void CreateSchemas(string connectionString, List<string> schemas)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
foreach (string schema in schemas)
{
string query = $"IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = '{schema.ToLower()}') BEGIN EXEC ('CREATE SCHEMA {schema.ToLower()}') END";
command.CommandText = query;
command.ExecuteNonQuery();
}
}
}
}
}
А затем просто использую.
public class EntityOverride : IAutoMappingOverride<Entity>
{
void IAutoMappingOverride<Entity>.Override(AutoMapping<Entity> mapping)
{
mapping.Schema("mySchema");
}
}