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?

Foi útil?

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;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top