Seguindo nosso tutorial, hoje vamos fazer a conexão entre o NHibernate e o nosso banco de dados Postgres, para isso temos que fazer o download do NHibernate, estou usando a versão 2.1.2, e depois descompactar o arquivo.
Vamos criar um diretório chamado Lib no mesmo nível onde se encontra a solution do Visual Studio, esse diretório vamos colocar todas as dlls que vamos utilizar, veja abaixo a hierarquia de diretórios.
Agora temos que copiar as seguintes dlls para dentro desse diretório, essas dlls podem ser encontradas dentro da pasta NHibernate-2.1.2.GA-bin\Required_Bins que baixamos anteriormente:
Para testar a conexão com o banco de dados Postgres vamos criar um projeto de testes, então clique com o botão direito em cima da solution -> Add -> New Solution Folder e coloque o nome de Testes
Agora temos que adicionar um novo projeto de teste, clicar com o botão direito em cima da pasta Testes e selecionar a opção Add -> New Project depois do lado esquerdo selecione Visual c# -> Test e do lado direito selecione o projeto Test Project, abaixo coloque o nome de Contatos.Factory.Teste
Agora temos que criar o arquivo hibernate.cfg.xml que será responsável por configurar as opções para conectar no banco de dados, clique com o botão direito em cima do projeto Contatos.Factoty.Testes selecionar a opção Add -> New Item após selecionar do lado esquerdo a opção Visual C# -> Data, do lado direito selecione a opção XML File e coloque o nome de hibernate.cfg.xml
Depois de criado o arquivo temos que adicionar as configurações, veja abaixo a configuração para o Postgres.
[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider"> NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect"> NHibernate.Dialect.PostgreSQL81Dialect</property>
<property name="connection.driver_class"> NHibernate.Driver.NpgsqlDriver</property>
<property name="connection.connection_string"> server=localhost;port=5432;database=contatos;uid=postgres;pwd=123456</property>
<property name="proxyfactory.factory_class"> NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
[/sourcecode]
Essa é a configuração padrão, o que vai mudar para os diversos bancos de dados que o NHibernate suporta, é o conteúdo de cada propriedade dessa.
Aqui tem um detalhe que não podemos esquecer, temos que mudar a propriedade Copy to Output Directory do arquivo de configuração, então clique com o botão direito em cima do arquivo hibernate.cfg.xml e selecione propriedades, na opção Copy to Output Directory mude para Copy Always.
Agora vamos adicionar um novo teste, para isso clique com o botão direito em cima do nosso projeto de teste Contatos.Factory.Teste e selecione a opção Add -> New Test, depois selecione a opção Unit Test e coloque o nome de ConexaoNHibernateTeste.cs
Agora vamos criar dois testes, um para criar o script para criação da base, e outro que executa a criação na base. Mas primeiramente temos que adicionar as referências das bibliotecas que vamos usar, clique com o botão direito em cima do projeto de teste e selecione Add Reference.
Uma nova janela se abrirá, selecione Browse e navegue até o diretório Lib que criamos no início desse post, selecione as DLLs e depois clique no botão OK.
Também adicione uma refência ao projeto Contatos.Factory, clique em Add Reference, selecione Projects e adicione o projeto Contatos.Factory
Depois de adicionado as referências vamos criar o dois métodos no projeto de teste, veja abaixo o código:
[sourcecode language=”csharp”]
/// <summary>
/// Criar o script do banco de dados
/// </summary>
[TestMethod]
public void GerarScript()
{
var cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(TipoTelefone).Assembly);
var schemaExport = new SchemaExport(cfg);
schemaExport.Create(true, false);
}
/// <summary>
/// Criar as tabelas no banco de dados
/// </summary>
[TestMethod]
public void GerarDataBase()
{
var cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(TipoTelefone).Assembly);
var schemaExport = new SchemaExport(cfg);
schemaExport.Create(true, true);
}
[/sourcecode]
Antes de executar os testes, a única coisa que temos fazer, é criar a database Contatos no banco de dados.
Agora podemos executar os métodos de teste, primeiramente execute o método GerarScript vemos que o NHibernate vai ler todos os nossos mapeamentos (arquivos hbm que se encontra no projeto Contatos.Factory) e gera o script SQL. Veja que o NHibernate cria todas as sequences, chaves primárias, chaves estrangeiras, tabelas associativas que configuramos anteriormente, por esse motivo é muito importante criar os mapemanetos corretos para que nosso banco também fique correto.
Depois de verificar o script e validar que todas as tabelas, PKs, FKs estão corretas, podemos excutar na base, execute o método GerarDataBase, a saída do teste será o mesmo, o script SQL, porém se verificarmos na base as nossas tabelas foram criadas.
Nessa Parte 3 vimos como configurar e gerar uma base através no NHibernate, no próximo post vamos criar o CRUD.
Até a proxima!
Tentei trocar o banco de dados Postgres por MS Access e gera diversos erros. Seria os mesmos passos ? Tem alguma dica com esse banco de dados ? Valew
Eduardo,
Quando trocamos de banco temos que alterar as configurações de conexão (arquivo hibernate.cfg.xml) e também o mapeamento que esta dentro da pasta Mappings.
É bem provável que você terá que alterar como a chave é gerada ja que o Postgres usa sequence e o Access usa auto increment..
Você terá que usar outra DLL Nhibernate.JetDriver.dll para fazer a conexão com o access, você pode baixar o projeto direto do SubVersion do NHibernate e compilar https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.JetDriver/
Qualquer dúvida post aí que tentamos ajudar!
Até +
Olá Leandro.
Muito bom seus artigos, só está ocorrendo um erro aqui para mim.
Quando eu tento executar o teste ‘GerarScript’ ele lança uma exceção do tipo ‘FileNotFoundException’… Ele cria uma pasta ‘TestResults\Nome\Out\’ e procura pelo arquivo ‘hibernate.cfg.xml’.. Ele existe no projeto, mas não é criado nesta pasta.
Sabe me dizer o que pode ser?
Obs.: A propriedade Copy to Output Directory está setada já para ‘Copy always’
Erickson,
Muito estranho esse erro… ja que a propriedade Copy to Output Directory ja está setada para Copy always
Tenta fazer o seguinte
1) Apague as pastas bin e obj do projeto e compile o projeto novamante
2) se a opção 1 não der certo, copie o arquivo hibernate.cfg.xml dentro da pasta bin isso tem q funcionar com toda certeza
att,
Leandro Prado
Testei as 2 formas que você falou :
1ª) Exclui todas as pastas bin e obj dos projetos, recompilei toda a solution e mesmo assim continua com o erro.
2ª) Verificando a pasta bin eu vi que o arquivo já se encontra lá.
Teria mais alguma ideia?
kramba….
a opção 2 tinha que funcionar…. é alguma coisa que o VS não está conseguindo encontrar o arquivo de configuração do BD
Bom dia Leandro,
Ao executar o teste estou recebendo a seguinte mensagem de erro:
Test method Contatos.Factory.Teste.ConexaoNHibernateTeste.GerarScript threw exception: NHibernate.Cfg.HibernateConfigException: An exception occurred during configuration of persistence layer. —> System.IO.DirectoryNotFoundException: Não foi possível localizar uma parte do caminho ‘C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies;PrivateAssemblies\hibernate.cfg.xml’..
Poderias me ajudar a identificar o problema?
Obrigado!
Douglas,
Parece que é o mesmo erro que o Erickson…
Tenta fazer o seguinte
1) Apague as pastas bin e obj do projeto e compile o projeto novamante
2) se a opção 1 não der certo, copie o arquivo hibernate.cfg.xml dentro da pasta bin isso tem q funcionar com toda certeza
att,
Leandro Prado
Realmente, mas já executei estes procedimentos nao houve progresso.
vou baixar o projeto aqui e ver o que acontece.. vc esta usando qual VS???
acabei de baixar o projeto…
alterei para conectar no MySQL
deletei as pastas BIN e OBJ do projeto Contatos.Factory.Teste
e ocorreu tudo certo… sem nenhum erro….
esse teste foi realizado com VS2010 + MySQL
O problema (no meu caso e parecer ser no caso do Erickson) é que o output directory do projeto de testes não é o mesmo aonde a ferramenta de testes do VS2008 procura o arquivo de config. Pra ficar mais claro, é isso aqui:
OutputDir = “Contatos\Contatos.Factory.Teste\bin\Debug” (aqui tem o arquivo)
OndeProcura = “Contatos\TestResults\&NomePC+Data\Out\” (aqui não)
Por que ele faz isso eu já não sei, assim como também não sei porque ele não gera o mesmo conteúdo nas duas pastas.
De qualquer forma, com o TestDriven + NUnit resolve-se. Mas pra quem gosta de usar tudo “nativamente” do VS é um pouco chato. Talvez em alguma propriedade do teste seja possível setar alguns arquivos necessário (sei lá, uma espécie de Post Build-Events). Eu ainda acho que faria mais sentido se o teste “rodasse” dentro da pasta de output do mesmo, ou então que o conteúdo dessa pasta ali “TestResult” fosse o mesmo do output do projeto.
Mas, vai saber hehehe.
Eu não sei se muda muita coisa, mas eu abri aqui no VS2008 com o PostgreSQL..
Tem como passar pelo menos o script de criação do banco?
Grato.
Erickson
O Douglas estava com o mesmo problema e resolveu instalando o NUnit para realizar os teste..tente fazer o mesmo
Eu não tenho o script em Postgres, tive que desinstalar o Postgres da minha máquina… segue o script para ser usado com MySQL veja se te ajuda…. http://www.leandroprado.com.br/wp-content/uploads/2010/12/contatos_mysql.txt
att,
Leandro Prado
Olá Leandro!
Gostaria de parabenizá-lo pelo excelente artigo.
Estou acompanhando o passo a passo, e encontrei um erro.
Aqui no site, você coloca as classes que estão na pasta Entity sem o modificador de acesso public. Tive que recorrer ao ZIP com o código fonte que você disponibilizou para descobrir o erro que o Visual Studio estava gerando.
Abraços!
Marco,
Acabei de ver as classes que estão descritas na parte 2 e todos as propriedades estão como public virtual…
att,
Leandro Prado
Leandro, em primeiro lugar parabéns pelo Blog e pela qualidade do material postado.
Estou acompanhando esta série e fazendo no VS2010 (10.0.30319.1 RTMRel) e usando banco de dados MSSQL. Ao rodar os testes, eles passam porém o script não é gerado. Tentei forçar a geração em arquivo com “SetOutputFile” mas o arquivo gerado fica em branco. Baixei o exemplo 3 e é reportado o mesmo erro do Erickson.
Realmente o arquivo não se encontra lá
Test method Contatos.Factory.Teste.ConexaoNHibernateTeste.GerarScript threw exception:
NHibernate.Cfg.HibernateConfigException: An exception occurred during configuration of persistence layer. —> System.IO.FileNotFoundException: Could not find file ‘C:\Projetos\Contatos\TestResults\build_BUILD-PC 2011-04-04 21_19_31\Out\hibernate.cfg.xml’.
Márcio,
Esse erro foi arrumado instalando o NUnit q também é para realizar testes case..
att,
Leandro Prado
Obrigado.
E mais uma vez, parabéns.
Valeu!! 😀
Olá Leandro, boa tarde
Primeiramente, parabêns pelo ótimo tutorial.
Como eu faço para usar o sql server 2008 como banco ?
Elton
Tem que alterar o “Dialect” no arquivo de configuração
Veja http://nhforge.org/doc/nh/en/index.html#configuration-optional-dialects
att,
Leandro Prado
Obrigado Leandro …
Abc
Leandro, está dando o seguinte erro na hora de executar o “GerarDataBase”:
Test method Contatos.Factory.Teste.ConexaoNHibernateTeste.GerarDataBase threw exception:
NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.NpgsqlDriver. —> System.Reflection.TargetInvocationException: Uma exceção foi acionada pelo destino de uma chamada. —> System.ArgumentException: Não foi possível localizar o Provedor de Dados .Net Framework solicitado. Talvez ele não esteja instalado.
Estou usando o VisualStudio 2010 com hibernate 3.2.0
Obrigado
Paulo
Seu projeto está sem o provider para conexão com o banco
Veja as referências do projeto se possui a dll do Postgress
att,
Leandro Prado
‘Agora temos que adicionar um novo projeto de teste, clicar com o botão direito em cima da pasta Testes e selecionar a opção Add -> New Project depois do lado esquerdo selecione Visual c# -> Test e do lado direito selecione o projeto Test Project, abaixo coloque o nome de Contatos.Factory.Teste’
fiz isso aí, mas qdo clico com o botçao direito em cima de ‘Contatos.Factory.Teste’ não aparece nenhuma opção pra adicionar novo item
só consigo visualizar essa opção quando clico em ‘testes’, mas mesmo assim, não vem a opção ‘visual c# – data’
fiz exatamente como vc descreveu… oque pode estar acontecendo?
e outra,vc colocou o projeto pra 2010 agora??
Rafaela
Tem que aparecer essa opção… Você criou um projeto de teste?
Qualquer coisa baixe o projeto que está disponivel para download no final do post!
att,
Leandro Prado
Primeiramente parabenizo pelo excelente trabalho com o blog, precisamos muito de blogs como este.
e gostaria de saber se alguém pode me ajudar, quando rodo o a Nunit de testes ele me gera o seguinte erro:
1>—— Build started: Project: FirstSolutions, Configuration: Debug Any CPU ——
1> FirstSolutions -> C:\Users\mrocha\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutions\bin\Debug\FirstSolutions.dll
1> O sistema não pode encontrar o arquivo especificado.
1>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4209,5): error MSB3073: The command “copy C:\Users\mrocha\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutions\..\sharedLibs\sqlce*.dll C:\Users\mnascimento\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutions\bin\Debug\” exited with code 1.
2>—— Build started: Project: FirstSolutionTest, Configuration: Debug Any CPU ——
2> FirstSolutionTest -> C:\Users\mnascimento\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutionTest\bin\Debug\FirstSolutionTest.dll
2> O sistema não pode encontrar o arquivo especificado.
2>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4209,5): error MSB3073: The command “copy C:\Users\mrocha\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutionTest\..\SharedLibs\sqlce*.dll C:\Users\mnascimento\Documents\Visual Studio 11\Projects\FirstSolution\FirstSolutionTest\bin\Debug\” exited with code 1.
========== Build: 0 succeeded, 2 failed, 0 up-to-date, 0 skipped ==========
Um abraço a todos
Bonsoir, LEANDRO PRADO merci d’avoir partage ce bon tutiriel je suis à l’étape 3
“Depois de adicionado as referências vamos criar o dois métodos no projeto de teste, veja abaixo o código:”
Où dois-je mettre ces deux methodes?
Boa noite, muito bom os tutoriais , sou iniciando em programação .NET, fiquei na duvida em como e onde colocar , quando você disse: “Depois de adicionado as referências vamos criar o dois métodos no projeto de teste, veja abaixo o código:” e como criar o banco de dados , por fora do visual studio ou dentro do mesmo?
Obrigado