Как вы проверяете, существует ли таблица с помощью NHibernate (или Fluent)?

StackOverflow https://stackoverflow.com/questions/1557023

Вопрос

Какой наилучший, наиболее последовательный способ проверить, существует ли таблица в NHibernate (или с помощью Fluent-NHibernate)?

Возможно ли это вообще?Я имею в виду, что это кажется простой задачей для такого сверхмощного ORM.

Также по связанному вопросу, можете ли вы проверить, существует ли набор таблиц или целая схема с помощью NHibernate?

Это было полезно?

Решение

Если вы где-нибудь сохраните конфигурацию NHibernate или сделаете это перед созданием фабрики сеансов, можно будет проверить сгенерированную схему на соответствие базе данных.

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }

Другие советы

Я посмотрел в исходном коде SchemaUpdate.Я знал, что SchemaUpdate может обнаружить отсутствующую таблицу, а затем сгенерировать сценарий создания, а не сценарий обновления.Конечно же, ответ был там.

В GetTableMetadata функция в NHibernate.Tool.hbm2ddl.DatabaseMetadata object вернет значение null, если таблица не существует в базе данных.

Обычно SchemaUpdate создает объект DatabaseMetaData и передает в Configuration объект.Но, похоже, все, что вам нужно для создания DatabaseMetaData, - это объект DbConnection и Dialect.

SchemaUpdate создает DatabaseMetaData таким образом:

connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);

NHibernate.Cfg.Configuration затем звонит

ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);

Этот вопрос и ответ появлялись повсюду в Google при поиске такого решения, поэтому я подумал, что изложу то, что сработало [из-за возраста вопросов, скорее всего, дополнение] для меня, более точным и кратким образом;"Доступный":

var configuration = Fluently.Configure()
    .Database(MsSqlConfiguration
    .MsSql2008
    ...
    .BuildConfiguration();

    var session = configuration.BuildSessionFactory().OpenSession();

    DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
    //TABLE_NAME e.g. "hibernate_unique_key"
        if (meta.IsTable("TABLE_NAME"))
        {
        ...

Надеюсь, это кому-нибудь поможет, потому что я внедрил замысловатую стратегию, подобную описанной выше, прежде чем наткнуться на это ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top