NHibernate
Tecnologia da Informação

NHibernate


NHibernate é uma biblioteca (Framework) que possibilita a conexão a um banco de dados Sql sem a necessidade do uso de strings de conexão. Com ele é possível persistir (receber e enviar) dados de uma tabela do banco de dados de maneira muito simples e intuitiva.

Assumimos que o programador já tenha algum conhecimento em Asp.net para criar as classes necessárias.

Esse post cobrirá os seguintes tópicos:
  • Download e Instalação do NHibernate
  • Criar uma aplicação em Asp.net com C#
  • Criar a tabela no Bando de Dados
  • Criar a classe em C#
  • Criar o arquivo de Mapeamento
  • Criar o arquivo de Configuração do NHibernate
  • Exemplos de uso do NHibernate

Vamos ao tutorial!


Download e Instalação do NHibernate

Faça download do Nhibernate em sua página oficial e salve em seu computador. Nos arquivos baixados existem alguns exemplos de uso e exemplos de arquivos de configuração para diversas linguagens Sql. Lembrando que nesse post utilizaremos o MySql, mas o framework pode ser usado com qualquer outra linguagem Sql.

Criar uma aplicação em Asp.net com C#

Primeiramente crie uma aplicação em Asp.net. Confira nosso outro post para o passo-a-passo. No momento da criação, selecione o .Net Framework 3.5. Com a aplicação criada, será criado automaticamente um arquivo chamado Web.config. Esse é o arquivo de configuração da aplicação que ensinaremos a utilizar mais a frente.
Agora precisamos adicionar referências ao NHibernate. Para isso clique com o botão direito em References depois em Add Reference. Agora, na guia Browse, ache a pasta Required_Bins na pasta que você baixou anteriormente e adicione todas os arquivos com extensão .dll dessa pasta. (lesi.Collections.dll e NHibernate.dll)

Criar a tabela no Bando de Dados

Existem algumas possibilidades de se criar uma tabela MySql. Já ensinamos uma em nosso antigo post MySql - Primeiros passos. Outra opção é importar um arquivo com as strings necessárias usando o phpMyAdmin na guia Importar.
Pois bem, o arquivo 'User.sql' abaixo cria uma tabela chamada User no banco de dados TesteNHibernate.

CREATE DATABASE IF NOT EXISTS `TesteNHibernate`;

CREATE TABLE IF NOT EXISTS `TesteNHibernate`.`User` (
`UserId` int(11) NOT NULL AUTO_INCREMENT,
`Username` text COLLATE latin1_general_cs NOT NULL,
`Password` text COLLATE latin1_general_cs NOT NULL,
`Tipo` text COLLATE latin1_general_cs NOT NULL,
PRIMARY KEY (`UserId`)
)
ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;

O uso de uma coluna identificadora 'UserId' é obrigatório e não pode ser nomeado apenas como 'Id' pois essa é uma palavra reservada do NHibernate.

Criar a classe em C#

A classe deve ser nomeada como User.cs, mesmo nome da tabela, e deve ficar como escrito abaixo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TesteNHibernate
{
public class User
{
public User() { }

public virtual int UserId { get; set; }

public virtual string Username { get; set; }

public virtual string Password { get; set; }

public virtual string Tipo { get; set; }
}
}

Criar o arquivo de Mapeamento

Agora, crie um arquivo xml chamado User.hbm.xml com o seguinte código:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="TesteNHibernate" assembly="TesteNHibernate">
<class name="User" table="User">

<id name="UserId" column="UserId" type="integer">
<generator class="native"></generator>
</id>

<property name="Username" type="String" length="40"/>
<property name="Password" type="String" length="40"/>
<property name="Tipo" type="String" length="40"/>
</class>
</hibernate-mapping>

Agora, no Solution explorer do Visual Studio, clique com o botão direito no arquivo User.hbm.xml e vá em Propriedades. Na opção Build Action selecione Embedded Resource. Não deixe de fazer isso em todos os arquivos xml utilizados, se não o NHibernate não conseguirá acessar as tabelas.

Criar o arquivo de Configuração do NHibernate

Na verdade, este arquivo já existe, é o Web.config. O arquivo está bem grande pois já possui algumas alterações que evitam erros de execução, tanto no localhost quanto em alguma hospedagem. Ele deve ficar do seguinte modo:

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
</sectionGroup>
</sectionGroup>
</configSections>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

<!--Para localhost-->
<property name="connection.connection_string">Server=localhost;Database=TesteNHibernate;User ID=seu_id;Password=sua_senha</property>

<mapping assembly="Clinolhos"/>
</session-factory>
</hibernate-configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<customErrors mode="Off"/>
<compilation debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->

<authentication mode="Windows"/>
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->

<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->

<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="ScriptModule"/>
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory"/>
<remove name="ScriptHandlerFactoryAppServices"/>
<remove name="ScriptResource"/>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</handlers>
</system.webServer>
<runtime>
<assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>


Logo abaixo da linha <!--Para localhost--> você deve modificar o usuário e senha do seu MySql. (Onde está escrito 'seu_id' e 'sua_senha')

Exemplos de uso do NHibernate

Agora, vamos a alguns exemplos da utilização do NHibernate para ler e salvar dados de uma tabela.

protected void Button1_Click(object sender, EventArgs e)
{
User user = new User();
//user.UserId -> nao é necessário pois é automático
user.Username = "username";
user.Password = "password";
user.Tipo = "tipo";

CreateUser(user);
}

public void CreateUser(User user)
{
Configuration cfg = new Configuration();
cfg.AddAssembly("TesteNHibernate");
ISessionFactory factory = cfg.BuildSessionFactory();
using (ISession session = factory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(user);
//session.SaveOrUpdate(user); //Poderiamos usar SaveOrUpdate se o User já existisse.
//Nesse caso devemos passar o UserId da linha que queremos alterar.
transaction.Commit();
session.Close();
}
}
}

public User GetUserById(int id) //Pode-se mudar id por qualquer outra propriedade
{
User elseUser = new User();
Configuration cfg = new Configuration();
cfg.AddAssembly("TesteNHibernate");

ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();

session = factory.OpenSession();

IList searchUserList = session.CreateCriteria(typeof(User)).List();

foreach (User searchUser in searchUserList)
{
if (searchUser.UserId == id)
{
return searchUser;
}
}
return elseUser;
}

Bom, é isso. O Dica de Código espera que esse post seja útil para quem está aprendendo. E como sempre, qualquer dúvida é só entrar em contato conosco (acesse a página Contato) por e-mail ou pelo Facebook que teremos o prazer em ajudá-lo.

Faça download do aplicativo com os códigos acima.

Acesse aqui o artigo que foi utilizado como base para a criação do post.

Simples Assim



loading...

- Alterar Senha Mysql No Linux
Alterando a senha MySQL no Ubuntu Comando para alterar a senha do gerenciador de banco de dados mysql-server: mysqladmin -h localhost -u [usuário] -p password  [pressione enter] Abra o terminal e digite:mysqladmin -h localhost -u root -p password...

- [mysql] Alterar Senhas De Usuários
Usando a ferramenta mysqladmin é possível alterar as senhas dos usuários facilmente. Exemplo: $ mysqladmin -uusuario -psenhaantiga password novasenha Caso queira atribuir uma senha para um usuário root que não tenha, utilize o comando abaixo: $...

- [oracle] Configurando Fra
A Flash Recover Area (FRA) é muito simples de ser configurada, mas antes, confirme se sua instância atende os requisitos abaixo: A instância deve estar em modo archivelog;Deve-se ter uma área para recuperação habilitada;Se você usar RAC, a área...

- [oracle] Modo Archive
É altamente recomendado que as instâncias Oracle estejam em modo Archive, porém, não são raras as vezes que encontramos instâncias com este modo desabilitado. Os logs de archive (archivelogs) são de muita importância para uma eventual recuperação...

- [oracle] Tempo Limite De Conexão
Neste post irei explicar como colocar um tempo de limite de conexão para os usuários do banco de dados Oracle. 1. Conecte-se ao banco de dados com o usuário system ou sys. 2. Verifique se o parâmetro RESOURCE_LIMIT está como 'true',...



Tecnologia da Informação








.