Como você verifica se existe uma tabela com Nibernate (ou fluente)?
-
21-09-2019 - |
Pergunta
Qual é a melhor e consistente maneira de verificar se existe uma tabela no Nibernate (ou com Nibernato Fluente)?
Isso é possível? Quero dizer, parece uma tarefa simples para um ORM tão pesado.
Também em uma pergunta relacionada, você pode verificar se existe um conjunto de tabelas ou um esquema inteiro com o Nibernate?
Solução
Se você armazenar sua configuração inibida em algum lugar ou fazê -lo antes de criar sua fábrica de sessão, é possível validar o esquema gerado em relação ao banco de dados.
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
Outras dicas
Eu olhei no código -fonte do esquemapdate. Eu sabia que o SchemaUpdate poderia detectar uma tabela ausente e, em seguida, gerar um script de criação, em vez de um script de atualização. Com certeza, a resposta estava lá.
o GetTableMetadata
função em NHibernate.Tool.hbm2ddl.DatabaseMetadata
O objeto retornará nulo se uma tabela não existir em um banco de dados.
Normalmente, o esquemapdate cria um objeto de banco de dados e passa para um Configuration
objeto. Mas parece que tudo o que você precisa para criar um DatabaseMetadata é um objeto DBConnection e dialeto.
SchemaUpdate cria um banco de dados de forma assim:
connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
NHibernate.Cfg.Configuration
então liga
ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);
Essa pergunta e resposta surgiram em todos os lugares do Google ao pesquisar essa solução, então pensei em colocar o que funcionaria [devido à idade das perguntas, provavelmente uma adição] para mim de uma maneira mais precisa e sucinta; "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"))
{
...
Espero que ajude alguém porque eu implementei uma estratégia complicada semelhante ao acima antes de tropeçar nisso;)