NHibernate使用架构作为表名前缀
如何以以下格式为表名添加前缀NHibernate使用架构作为表名前缀,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,如何以以下格式为表名添加前缀 [schema][.][tableName] 如果我这样做 public class PrescriptionOverride : AutoMappingOverride<Prescription> { mapping.Table("schema.TableName); } 如果架构尚不存在,则需要使用创建该架构。但是,当您使用NH创建数据库模式时,这些将生效 public class CreateSchema : AbstractAuxil
[schema][.][tableName]
如果我这样做
public class PrescriptionOverride : AutoMappingOverride<Prescription>
{
mapping.Table("schema.TableName);
}
如果架构尚不存在,则需要使用创建该架构。但是,当您使用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);
或:
我可以用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 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");
}
}
你试过SchemaschemaName;?不,我是NHibernate的新手,所以我对这样的选择一无所知。我会调查的。谢谢你和我ones@RadimKöhler,你能帮我使用schema选项吗?我尝试过使用mapping.Schematest;然后是mapping.TablemyTable,但无法使其正常工作。知道我做错了什么吗?我假设如果模式不存在,它将自动创建。我使用的是IAutoMappingOverride,而不是David在回答中指出的ClassMap。。我们还需要一些特殊的SQL触发器,再加上模式设置。。应该有用
public class EntityOverride : IAutoMappingOverride<Entity>
{
void IAutoMappingOverride<Entity>.Override(AutoMapping<Entity> mapping)
{
mapping.Schema("mySchema");
}
}
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");
}
}