Как проверить, существует ли таблица с NHibernate (или свободно)? - PullRequest
5 голосов
/ 13 октября 2009

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

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

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

Ответы [ 3 ]

12 голосов
/ 14 октября 2009

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

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }
3 голосов
/ 13 октября 2009

Я посмотрел в исходном коде 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(...);
2 голосов
/ 29 июля 2015

Этот вопрос и ответ всплывали повсюду в 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"))
        {
        ...

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

...