Как вы проверяете, существует ли таблица с помощью NHibernate (или Fluent)?
-
21-09-2019 - |
Вопрос
Какой наилучший, наиболее последовательный способ проверить, существует ли таблица в 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"))
{
...
Надеюсь, это кому-нибудь поможет, потому что я внедрил замысловатую стратегию, подобную описанной выше, прежде чем наткнуться на это ;)