NHibernate在表名前面加一个模式



如何以以下格式为表名添加前缀

[schema][.][tableName]

如果我做以下

public class PrescriptionOverride : AutoMappingOverride<Prescription>
{
mapping.Table("schema.TableName);
}

如果模式实际上不存在于数据库中,则不起作用。它实际上会忽略该表。

"表名">

从映射

那么,如何使用NHibernate创建一个SQL模式,以便使用该模式将表附加到它上呢?

SQL等价物:

create schema [mySchema]
go
create table [mySchema].[MyTable](id int)

我可以用NHibernate创建模式,问题是NHibernat首先创建表,然后创建辅助对象,在这种情况下是模式。由于表使用的是模式,而不是创建的,所以配置会崩溃。

这是配置

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

如果模式还不存在,则需要使用辅助数据库对象来创建模式。但是,当您使用NH创建数据库模式时,这些会生效。

public class CreateSchema : AbstractAuxiliaryDatabaseObject
{
public override string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema)
{
return "CREATE SCHEMA [mySchema]";
}
public override string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema)
{
return "DROP SCHEMA [mySchema]";
}
}

然后你需要将其添加到你的配置中:

config.AddAuxiliaryDatabaseObject(new CreateSchema());

当你这样做时,它将生效:

new SchemaExport(config).Create(true, true);

或:

new SchemaExport(config).Drop(true, true);

最新更新