Как проверить, существует ли таблица с NHibernate (или свободно)?

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

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

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

12.10.2009 21:22:54
Вы хотите проверить это на соответствие вашим картографическим данным?
Aaron Fischer 13.10.2009 00:05:11
В любом случае, я хочу посмотреть, существует ли физическая таблица.
Mark Rogers 13.10.2009 01:39:53
3 ОТВЕТА
РЕШЕНИЕ

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

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }
12
14.10.2009 19:10:13
Хорошо, я искал такие вещи
Mark Rogers 14.10.2009 19:14:47

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

GetTableMetadataФункция NHibernate.Tool.hbm2ddl.DatabaseMetadataобъекта будет возвращать нулевое значение , если таблица не существует в базе данных.

Обычно 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(...);
3
14.10.2009 20:14:14

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

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"))
        {
        ...

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

2
29.07.2015 03:56:02