NHibernate使用模式为表名添加前缀

时间:2018-12-10 08:36:13

标签: nhibernate fluent-nhibernate

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

[schema][.][tableName]

如果我执行以下操作

public class PrescriptionOverride : AutoMappingOverride<Prescription>
{
    mapping.Table("schema.TableName);
}
如果数据库中实际上不存在该模式,则

不起作用。实际上,它将忽略该表。

  

'TableName'

被映射

因此,如何使用NHibernate创建SQL模式,以便可以使用该模式将表附加到表上。

SQL等效项:

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

2 个答案:

答案 0 :(得分:2)

我可以使用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");
     }
}

答案 1 :(得分:0)

如果尚不存在架构,则需要使用auxiliary database objects创建架构。但是,当您使用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);