Pergunta

Assim, novato utilizador NHibernate; tentando envolver meu cérebro em torno dele.

Eu estou contemplando como lidar com a implantação, e injeção posterior de add-ons para uma aplicação web (o que pode exigir suas próprias classes de persistência).

Eu estava pensando que o uso SchemaExport para a implantação iria funcionar muito bem, mas eu queria saber se existe uma maneira demasiado obter NHibernate para me dizer em um comum, maneira baseada em código que uma exportação de esquemas já foi feito, ou não . Basicamente, eu quero fazer smething como neste pseudocódigo:

  if(!_cfg.HasSchemaForType(typeof(MyType))
       ExportSchema(typeof(MyType));
  else
       UpdateSchema(typeof(MyType));

onde as duas funções usaria internamente SchemaExport ou SchemaUpdate, respectivamente.


EDIT: Pessoal, eu aprecio a resposta até agora, mas eles estão faltando o ponto um pouco. O que eu estou tentando configurar uma maneira para que o aplicativo para permitir a adição e remoção de add-ons que podem exigir mudanças no db. Eu não estou falando de versionamento meu próprio código ou similares (pelo menos, não como sua função primária). Então a questão é menos sobre quando eu implantar o aplicativo, e mais sobre quando eu adicionar ou remover um plug-in. Tem theis plug-in (daí o tipo de verificação pseudo-código) foi implantado antes? Se assim for, executar a atualização. Caso contrário, execute a exportação. Faz sentido?

Foi útil?

Solução

Não, NHibernate não faz o que você está pedindo. I imaginar que seria possível escrever algum código que exportou o esquema e, em seguida, comparou-o com o esquema de banco de dados. Mas provavelmente seria mais fácil de exportação numa base de dados temporária e usar uma ferramenta 3o partido, como redgate SQL Compare, para comparar os esquemas.

Mesmo se isso acontecesse o que está pedindo, eu não vejo como isso iria ajudar com a implantação, porque o seu objectivo é criar um banco de dados a partir do zero.

Editado para acrescentar: Assumindo que cada plugin tem seu próprio conjunto de tabelas, você pode determinar se o esquema foi implantado usando um dos vários métodos:

  • tentativa de carregar um dos objetos de plug-in e capturar a exceção.
  • Examine o esquema de banco de dados (usando o SMO para SQL Server) para verificar se a tabela (s) existir.
  • Criar um registro em uma tabela quando um plugin é implantado.

Outras dicas

Eu acho que o que você está procurando é SchemaUpdate.Execute em vez de usar SchemaExport. SchemaUpdate vai criar o esquema se ele já não existir, ou atualizá-lo se necessário e desejado.

que funciona para mim usando tanto MSSQL e SQLite.

new SchemaUpdate(config).Execute(false, true);

Sim, há, em 3,0 pelo menos

public static bool ValidateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg);
    try
    {
        myvalidator.Validate();
        myvalidator = null;
        return true;
    }
    catch (Exception ex)
    {
        MsgBox(ex.Message, "Schema validation error");
    }
    finally
    {
        myvalidator = null;
    }

    return false;
}

Para a parte de atualização, fazer.

public static void UpdateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
    schema.Execute(false, true);
    schema = null;
} // UpdateSchema

O objetivo da exportação esquema é para gerar o esquema completo a partir do zero. Realmente útil se você não tiver implantado o aplicativo ainda.

Depois da primeira implantação Eu recomendo usar uma ferramenta de migração que irá ajudá-lo com outras extensões / modificações do esquema. Se você pensar um pouco mais à frente você vai notar que você sequer exigem manipulação de dados (por exemplo, a remoção de dados errados que foi gerada devido a um bug) como os aplicativos evoluem. Isso é tudo uma ferramenta de migração pode ajudá-lo.

Dê uma olhada em:

Aqui está uma lista de mais ferramentas de migração para .NET respondeu com uma pergunta SO:

A idéia original de migrações originados de Ruby on Rails e tem sido "clonada" para outras estruturas ao longo da última. É por isso que é definitivamente bom para ler sobre a idéia original em http://guides.rubyonrails.org/migrations. html também.

Se você tiver VS Team Suite ou a edição Database Developer, pode sincronizar e acompanhar as mudanças e, em seguida, fazer um script de implantação que irá criar todos os objetos certos para você. Também RedGate tem um esquema comparar produto que faz a mesma coisa se eu não estou enganado.

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