Ir para o conteúdo do rodapé
AJUDA DO .NET

NHibernate em C# (Como funciona para desenvolvedores)

NHibernate C# (Como funciona para desenvolvedores): Figura 1 - Página inicial do NHibernate C#

O NHibernate é uma poderosa estrutura de mapeamento objeto-relacional (ORM) projetada para uso com o .NET Framework. Ele oferece aos desenvolvedores uma maneira eficiente de preencher a lacuna entre o mundo orientado a objetos dos aplicativos .NET e o mundo relacional dos bancos de dados. Ao usar o NHibernate, você pode reduzir significativamente a quantidade de código repetitivo necessário para implementar as camadas de acesso a dados, tornando seus aplicativos .NET mais limpos e fáceis de manter.

O papel do ORM na simplificação das interações com o banco de dados

Frameworks ORM como o NHibernate simplificam as interações com bancos de dados relacionais, permitindo que os desenvolvedores trabalhem com dados em termos de objetos e suas propriedades, em vez de instruções SQL. Essa abstração ajuda os desenvolvedores a se concentrarem mais na lógica de negócios de seus aplicativos e menos nos comandos SQL subjacentes e no esquema do banco de dados. Por exemplo, o NHibernate lida com toda a geração e execução de SQL, permitindo que operações como inserções, exclusões e atualizações sejam realizadas com simples conversão e manipulação de objetos.

Configurando o NHibernate em um projeto .NET

Para começar a usar o NHibernate em seu projeto .NET , o primeiro passo é instalar o pacote NHibernate. Isso pode ser feito facilmente através do Gerenciador de Pacotes NuGet do Visual Studio, usando o seguinte comando:

Install-Package NHibernate

NHibernate C# (Como funciona para desenvolvedores): Figura 2 - Abra um console de linha de comando e insira o comando acima para instalar o NHibernate

Configurando o NHibernate com um arquivo de configuração XML

Após a instalação do NHibernate, o próximo passo é configurá-lo. Isso envolve a criação de um arquivo de mapeamento do Hibernate que detalha as configurações do seu servidor de banco de dados e os detalhes do mapeamento de seus objetos para as tabelas do banco de dados. O arquivo XML principal, geralmente denominado hibernate.cfg.xml, inclui configurações como a string de conexão do banco de dados, o dialeto e outras configurações específicas do banco de dados.

<?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="connection.driver_class">
      NHibernate.Driver.SqlClientDriver
    </property>
    <property name="connection.connection_string">
      Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
    </property>
    <property name="dialect">
      NHibernate.Dialect.MsSql2012Dialect
    </property>
    <property name="show_sql">true</property>
    <mapping resource="Employee.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
<?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="connection.driver_class">
      NHibernate.Driver.SqlClientDriver
    </property>
    <property name="connection.connection_string">
      Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
    </property>
    <property name="dialect">
      NHibernate.Dialect.MsSql2012Dialect
    </property>
    <property name="show_sql">true</property>
    <mapping resource="Employee.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
XML

Entendendo os Componentes Principais do NHibernate

Um dos componentes principais do NHibernate é a Session Factory, que foi projetada utilizando o padrão de projeto Factory. Este componente cria objetos de sessão que gerenciam a conexão com o banco de dados e armazenam as operações transacionais. A criação da Session Factory é dispendiosa, por isso geralmente é feita apenas uma vez durante o ciclo de vida da aplicação, tornando-a um elemento crucial para a otimização do desempenho.

Classes e métodos principais no NHibernate

O NHibernate gira em torno de diversas classes e métodos essenciais. Por exemplo, a interface ISession desempenha um papel fundamental no NHibernate, facilitando a criação de sessões de consulta e manipulação de dados. Métodos como OpenSession ajudam os desenvolvedores a iniciar transações, executar comandos SQL e consultar o banco de dados usando instruções SQL ou a HQL (Hibernate Query Language) do NHibernate.

Mapeamento de entidades para tabelas de banco de dados com NHibernate

O mapeamento de entidades no NHibernate é realizado por meio de arquivos de mapeamento, geralmente escritos em XML. Esses arquivos, geralmente nomeados de acordo com a classe da entidade (por exemplo, Employee.hbm.xml ), definem como as propriedades de uma entidade são mapeadas para as colunas de uma tabela do banco de dados. Um arquivo de mapeamento típico inclui o nome da classe, o nome da tabela e detalhes sobre cada propriedade, incluindo a chave primária, o nome da coluna e o tipo de dados.

Análise detalhada das propriedades e atributos usados ​​em arquivos de mapeamento.

Nesses arquivos de mapeamento, você pode especificar vários atributos para cada propriedade, como restrições de não nulo ou restrições de unicidade. O NHibernate também permite mapeamentos complexos, como relacionamentos um-para-muitos e muitos-para-um, fornecendo um conjunto de ferramentas poderoso para representar estruturas de dados relacionais em uma estrutura orientada a objetos.

Executando comandos SQL e transações no NHibernate

O NHibernate simplifica as operações CRUD (Criar, Ler, Atualizar, Excluir) ao abstrair os comandos SQL subjacentes. Os desenvolvedores podem realizar essas operações sem escrever código SQL explícito, usando, em vez disso, os métodos fornecidos pela interface ISession. Por exemplo, para adicionar uma nova entidade ao banco de dados, você simplesmente cria uma nova instância do objeto, define suas propriedades e usa o método Save do ISession.

Gerenciando transações com ITransaction

As transações no NHibernate são gerenciadas por meio da interface ITransaction, que garante a integridade e a consistência dos dados. Utilizando o método BeginTransaction de ISession, os desenvolvedores podem garantir que todas as operações sejam concluídas com sucesso antes de confirmar os dados no banco de dados, ou reverter a operação caso algo dê errado, mantendo assim a estabilidade dos dados.

Exemplo de código completo

Este exemplo inclui a configuração dos arquivos de configuração e mapeamento do NHibernate e demonstra como realizar operações de criação, leitura, atualização e exclusão usando o NHibernate.

using NHibernate;
using NHibernate.Cfg;
using System;

// Define the Employee class with virtual properties
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

class Program
{
    private static ISessionFactory sessionFactory;

    static void Main()
    {
        // Initialize the SessionFactory using NHibernate configuration
        sessionFactory = new Configuration().Configure().BuildSessionFactory();

        // Perform database operations
        CreateEmployee();
        ReadEmployee(1);
        UpdateEmployee(1, "UpdatedName");
        DeleteEmployee(1);
    }

    static void CreateEmployee()
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var newEmployee = new Employee
            {
                FirstName = "Iron",
                LastName = "Software"
            };
            session.Save(newEmployee); // Save the new Employee object to the database
            transaction.Commit(); // Commit the transaction to finalize the insertion
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }

    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            // Retrieve the Employee object by its Id
            var employee = session.Get<Employee>(id);
            Console.WriteLine("Read Employee: " + employee.FirstName + " " + employee.LastName);
        }
    }

    static void UpdateEmployee(int id, string newFirstName)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            // Get the Employee object by its Id
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName; // Update the employee's first name
            session.Update(employee); // Update the Employee object in the database
            transaction.Commit(); // Commit the transaction to save changes
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }

    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            // Retrieve the Employee object to be deleted
            var employee = session.Get<Employee>(id);
            session.Delete(employee); // Delete the Employee from the database
            transaction.Commit(); // Commit the transaction to finalize the deletion
            Console.WriteLine("Employee deleted");
        }
    }
}
using NHibernate;
using NHibernate.Cfg;
using System;

// Define the Employee class with virtual properties
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

class Program
{
    private static ISessionFactory sessionFactory;

    static void Main()
    {
        // Initialize the SessionFactory using NHibernate configuration
        sessionFactory = new Configuration().Configure().BuildSessionFactory();

        // Perform database operations
        CreateEmployee();
        ReadEmployee(1);
        UpdateEmployee(1, "UpdatedName");
        DeleteEmployee(1);
    }

    static void CreateEmployee()
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var newEmployee = new Employee
            {
                FirstName = "Iron",
                LastName = "Software"
            };
            session.Save(newEmployee); // Save the new Employee object to the database
            transaction.Commit(); // Commit the transaction to finalize the insertion
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }

    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            // Retrieve the Employee object by its Id
            var employee = session.Get<Employee>(id);
            Console.WriteLine("Read Employee: " + employee.FirstName + " " + employee.LastName);
        }
    }

    static void UpdateEmployee(int id, string newFirstName)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            // Get the Employee object by its Id
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName; // Update the employee's first name
            session.Update(employee); // Update the Employee object in the database
            transaction.Commit(); // Commit the transaction to save changes
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }

    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            // Retrieve the Employee object to be deleted
            var employee = session.Get<Employee>(id);
            session.Delete(employee); // Delete the Employee from the database
            transaction.Commit(); // Commit the transaction to finalize the deletion
            Console.WriteLine("Employee deleted");
        }
    }
}
Imports NHibernate
Imports NHibernate.Cfg
Imports System

' Define the Employee class with virtual properties
Public Class Employee
	Public Overridable Property Id() As Integer
	Public Overridable Property FirstName() As String
	Public Overridable Property LastName() As String
End Class

Friend Class Program
	Private Shared sessionFactory As ISessionFactory

	Shared Sub Main()
		' Initialize the SessionFactory using NHibernate configuration
		sessionFactory = (New Configuration()).Configure().BuildSessionFactory()

		' Perform database operations
		CreateEmployee()
		ReadEmployee(1)
		UpdateEmployee(1, "UpdatedName")
		DeleteEmployee(1)
	End Sub

	Private Shared Sub CreateEmployee()
		Using session = sessionFactory.OpenSession()
		Using transaction = session.BeginTransaction()
			Dim newEmployee = New Employee With {
				.FirstName = "Iron",
				.LastName = "Software"
			}
			session.Save(newEmployee) ' Save the new Employee object to the database
			transaction.Commit() ' Commit the transaction to finalize the insertion
			Console.WriteLine("Employee created: " & newEmployee.Id)
		End Using
		End Using
	End Sub

	Private Shared Sub ReadEmployee(ByVal id As Integer)
		Using session = sessionFactory.OpenSession()
			' Retrieve the Employee object by its Id
			Dim employee = session.Get(Of Employee)(id)
			Console.WriteLine("Read Employee: " & employee.FirstName & " " & employee.LastName)
		End Using
	End Sub

	Private Shared Sub UpdateEmployee(ByVal id As Integer, ByVal newFirstName As String)
		Using session = sessionFactory.OpenSession()
		Using transaction = session.BeginTransaction()
			' Get the Employee object by its Id
			Dim employee = session.Get(Of Employee)(id)
			employee.FirstName = newFirstName ' Update the employee's first name
			session.Update(employee) ' Update the Employee object in the database
			transaction.Commit() ' Commit the transaction to save changes
			Console.WriteLine("Employee updated: " & employee.FirstName)
		End Using
		End Using
	End Sub

	Private Shared Sub DeleteEmployee(ByVal id As Integer)
		Using session = sessionFactory.OpenSession()
		Using transaction = session.BeginTransaction()
			' Retrieve the Employee object to be deleted
			Dim employee = session.Get(Of Employee)(id)
			session.Delete(employee) ' Delete the Employee from the database
			transaction.Commit() ' Commit the transaction to finalize the deletion
			Console.WriteLine("Employee deleted")
		End Using
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

Recursos de Portabilidade e Interoperabilidade de Banco de Dados

O NHibernate foi projetado com a portabilidade de banco de dados já garantida. Graças à sua configuração de dialetos, o NHibernate pode se adaptar à maioria dos bancos de dados SQL com alterações mínimas no código-fonte. Isso significa que você pode migrar de um servidor SQL para MySQL ou Oracle sem precisar reescrever sua camada de acesso a dados.

Adaptando o NHibernate para diversos sistemas de banco de dados, como o SQL Server.

Os arquivos de configuração XML no NHibernate permitem que os desenvolvedores especifiquem o dialeto SQL específico para seu sistema de banco de dados. Isso torna o NHibernate uma solução flexível que pode ser facilmente adaptada para funcionar com praticamente qualquer banco de dados relacional que suporte SQL, garantindo que seu aplicativo seja portátil em diferentes sistemas de banco de dados.

Utilizando NHibernate com IronPDF

NHibernate C# (Como funciona para desenvolvedores): Figura 3 - Página inicial do IronPDF

A integração do NHibernate com o IronPDF é uma combinação poderosa que pode aprimorar seus aplicativos .NET . Ele permite gerenciar operações de banco de dados com o NHibernate, enquanto utiliza o IronPDF para gerar documentos PDF a partir dos seus dados. Considere um cenário em que seu aplicativo precisa fornecer documentos específicos do usuário, como relatórios de funcionários, que precisam ser gerados e baixados em formato PDF. O NHibernate pode gerenciar com eficiência os processos de recuperação de dados do seu banco de dados, enquanto o IronPDF pode converter esses dados em arquivos PDF bem formatados.

Instale o IronPDF

Primeiro, certifique-se de que o IronPDF foi adicionado ao seu projeto. Você pode incluí-lo através do Gerenciador de Pacotes NuGet instalando o pacote IronPDF .

Install-Package IronPdf

NHibernate C# (Como funciona para desenvolvedores): Figura 4 - Instalar o IronPDF através do Gerenciador de Pacotes NuGet

Exemplo de código

Vamos analisar mais detalhadamente como implementar isso em sua aplicação. Após configurar o NHibernate e recuperar os dados necessários do banco de dados, como detalhes dos funcionários, você preparará um modelo HTML que representará a aparência que o documento PDF deverá ter. Este modelo HTML pode ser preenchido dinamicamente com dados obtidos do NHibernate. Por exemplo, se você estiver gerando um relatório para um funcionário, o modelo incluirá espaços reservados para o nome, o número de identificação e outros detalhes relevantes do funcionário.

Aqui está um exemplo de código detalhado que demonstra como buscar dados usando NHibernate e convertê-los em um PDF usando IronPDF:

using IronPdf;
using NHibernate;

static void CreateEmployeeReport(int employeeId)
{
    // Open a session to interact with the database
    using (var session = OpenSession())
    {
        // Retrieve the employee object based on the provided ID
        var employee = session.Get<Employee>(employeeId);

        // Create an instance of the ChromePdfRenderer class from IronPDF
        var renderer = new ChromePdfRenderer();

        // Create the HTML content for the PDF, embedding employee data into the HTML
        var htmlTemplate = $@"
            <html>
            <head>
                <title>Employee Report</title>
            </head>
            <body>
                <h1>Employee Details</h1>
                <p>Name: {employee.FirstName} {employee.LastName}</p>
                <p>ID: {employee.Id}</p>
            </body>
            </html>";

        // Render the HTML string as a PDF document
        var pdf = renderer.RenderHtmlAsPdf(htmlTemplate);

        // Save the generated PDF to a file
        pdf.SaveAs("EmployeeReport.pdf");
    }
}
using IronPdf;
using NHibernate;

static void CreateEmployeeReport(int employeeId)
{
    // Open a session to interact with the database
    using (var session = OpenSession())
    {
        // Retrieve the employee object based on the provided ID
        var employee = session.Get<Employee>(employeeId);

        // Create an instance of the ChromePdfRenderer class from IronPDF
        var renderer = new ChromePdfRenderer();

        // Create the HTML content for the PDF, embedding employee data into the HTML
        var htmlTemplate = $@"
            <html>
            <head>
                <title>Employee Report</title>
            </head>
            <body>
                <h1>Employee Details</h1>
                <p>Name: {employee.FirstName} {employee.LastName}</p>
                <p>ID: {employee.Id}</p>
            </body>
            </html>";

        // Render the HTML string as a PDF document
        var pdf = renderer.RenderHtmlAsPdf(htmlTemplate);

        // Save the generated PDF to a file
        pdf.SaveAs("EmployeeReport.pdf");
    }
}
Imports IronPdf
Imports NHibernate

Shared Sub CreateEmployeeReport(ByVal employeeId As Integer)
	' Open a session to interact with the database
	Using session = OpenSession()
		' Retrieve the employee object based on the provided ID
		Dim employee = session.Get(Of Employee)(employeeId)

		' Create an instance of the ChromePdfRenderer class from IronPDF
		Dim renderer = New ChromePdfRenderer()

		' Create the HTML content for the PDF, embedding employee data into the HTML
		Dim htmlTemplate = $"
            <html>
            <head>
                <title>Employee Report</title>
            </head>
            <body>
                <h1>Employee Details</h1>
                <p>Name: {employee.FirstName} {employee.LastName}</p>
                <p>ID: {employee.Id}</p>
            </body>
            </html>"

		' Render the HTML string as a PDF document
		Dim pdf = renderer.RenderHtmlAsPdf(htmlTemplate)

		' Save the generated PDF to a file
		pdf.SaveAs("EmployeeReport.pdf")
	End Using
End Sub
$vbLabelText   $csharpLabel

NHibernate C# (Como funciona para desenvolvedores): Figura 5 - Exemplo de saída do código acima

Neste código, OpenSession() é um método que inicializa uma sessão do NHibernate, que é usada para buscar os dados do funcionário. A classe ChromePdfRenderer do IronPDF pega o modelo HTML preenchido com os dados obtidos e o renderiza como um PDF. Este PDF está salvo localmente, mas também pode ser transmitido diretamente para um usuário através de uma interface web.

Conclusão

NHibernate C# (Como funciona para desenvolvedores): Figura 6 - Página de licenciamento do IronPDF

Neste tutorial, exploramos como o NHibernate simplifica as operações de banco de dados em aplicações .NET e como sua integração com o IronPDF aprimora a funcionalidade, permitindo a geração de documentos PDF dinâmicos. O NHibernate oferece ferramentas robustas de gerenciamento de dados, enquanto o IronPDF proporciona uma maneira prática de criar PDFs com qualidade profissional a partir de modelos HTML preenchidos com dados.

O IronPDF está disponível para teste gratuito , e as licenças começam em um valor acessível, sendo uma solução ideal para integrar a geração de PDFs de alta qualidade em seus aplicativos. Em conjunto, essas ferramentas oferecem uma solução abrangente para gerenciar dados e produzir documentos, ideal tanto para projetos de grande porte quanto para projetos de menor escala.

Perguntas frequentes

Como posso integrar o NHibernate com uma biblioteca de geração de PDF em C#?

O NHibernate pode ser integrado ao IronPDF usando o NHibernate para lidar com operações de banco de dados e recuperar dados, que o IronPDF pode então converter em documentos PDF. Isso permite a geração de PDFs dinâmicos com base em dados específicos do usuário.

Qual é a finalidade da Session Factory no NHibernate?

No NHibernate, a Session Factory é um componente crucial que cria objetos Session para gerenciar conexões com o banco de dados e executar operações transacionais. Ela otimiza o desempenho por ser custosa de criar e geralmente é instanciada apenas uma vez durante a vida útil da aplicação.

Você pode explicar como as operações CRUD são realizadas no NHibernate?

As operações CRUD no NHibernate são abstraídas por meio da interface `ISession`, que fornece métodos como Save , Update e Delete . Isso permite que os desenvolvedores executem essas operações sem escrever comandos SQL diretamente.

Quais são os benefícios de usar o NHibernate para desenvolvedores .NET?

O NHibernate beneficia os desenvolvedores .NET ao reduzir a quantidade de código repetitivo necessário para as camadas de acesso a dados, melhorando a manutenção das aplicações. Ele também abstrai as interações com o banco de dados, permitindo que os desenvolvedores se concentrem mais na lógica de negócios.

Como o NHibernate oferece suporte à portabilidade de banco de dados?

O NHibernate oferece suporte à portabilidade de banco de dados por meio de sua configuração de dialetos, o que permite sua adaptação a diversos bancos de dados SQL. Isso possibilita que os desenvolvedores migrem de um sistema de banco de dados para outro com alterações mínimas no código.

Qual é o papel dos arquivos de mapeamento no NHibernate?

Os arquivos de mapeamento no NHibernate, geralmente arquivos XML, definem como as propriedades de uma entidade são mapeadas para as colunas em uma tabela do banco de dados. Eles incluem detalhes importantes, como chaves primárias, nomes de colunas e tipos de dados, suportando mapeamentos complexos, como relacionamentos um-para-muitos.

Como gerenciar transações de forma eficaz no NHibernate?

Em NHibernate, as transações são gerenciadas usando a interface `ITransaction`, que garante a integridade dos dados. Os desenvolvedores podem usar o método BeginTransaction da interface `ISession` para lidar com as operações, confirmando os dados somente se todas as operações forem bem-sucedidas ou revertendo-os caso surja algum problema.

Como configurar o NHibernate em um projeto .NET?

Para configurar o NHibernate, instale o pacote NHibernate através do Gerenciador de Pacotes NuGet do Visual Studio usando o comando Install-Package NHibernate . Configure-o com um arquivo de mapeamento XML como `hibernate.cfg.xml` para definir as configurações do banco de dados e os mapeamentos de objetos.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim