Имя таблицы префиксов NHibernate со схемой - PullRequest
0 голосов
/ 10 декабря 2018

Как вы можете использовать префикс имен таблиц в следующем формате

[schema][.][tableName]

Если я сделаю следующее,

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

не будет работать, если схема на самом деле не существует вБД.На самом деле таблица будет игнорироваться.

'TableName'

от сопоставления

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

Эквивалент SQL:

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я мог бы создать схему с помощью 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");
     }
}
0 голосов
/ 10 декабря 2018

Вам потребуется использовать вспомогательные объекты базы данных для создания схемы, если она еще не существует.Однако они вступают в силу, когда вы используете 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...