Trang Designer – Thiết kế website – Mua bán theme giá rẻ, plugin giá rẻ – Dịch vụ thiết kế website giá rẻ chuyên nghiệp chuẩn SEO – Mua bán theme giá rẻ, plugin giá rẻ chính hãng 100% từ nhà cung cấp, hỗ trợ update trọn đời

NHibernate là một Object-Relational Mapper (ORM) mạnh mẽ, giúp chuyển đổi giữa các đối tượng trong ứng dụng .NET và các bảng trong cơ sở dữ liệu một cách tự động. Dưới đây là hướng dẫn cơ bản để sử dụng NHibernate trong một dự án ASP.NET Core Web API.
Tìm hiểu về NHibernate ORM và sử dụng trong ASP.NET Core Web API
Tìm hiểu về NHibernate ORM và sử dụng trong ASP.NET Core Web API

Tìm hiểu về NHibernate ORM

NHibernate là một Object-Relational Mapper (ORM) mạnh mẽ, giúp chuyển đổi giữa các đối tượng trong ứng dụng .NET và các bảng trong cơ sở dữ liệu một cách tự động. Nó cung cấp nhiều tính năng hữu ích như:

  • Mapping linh hoạt: Hỗ trợ mapping phức tạp giữa các lớp và bảng dữ liệu, có thể sử dụng cấu hình XML hoặc Fluent (Fluent NHibernate).
  • Lazy Loading và Eager Loading: Giúp tối ưu hóa hiệu suất truy xuất dữ liệu.
  • Caching: Hỗ trợ caching cấp độ đầu và cấp độ ứng dụng.
  • Quản lý transaction: Tích hợp quản lý transaction một cách hiệu quả.
  • Hỗ trợ cho các loại cơ sở dữ liệu khác nhau: Như SQL Server, MySQL, PostgreSQL,…

Dưới đây là hướng dẫn cơ bản để sử dụng NHibernate trong một dự án ASP.NET Core Web API.

Cài đặt các package cần thiết

Bạn cần cài đặt các package liên quan đến NHibernate và Fluent NHibernate (nếu muốn sử dụng mapping kiểu Fluent):

dotnet add package NHibernate
dotnet add package FluentNHibernate

Tạo Entity và Mapping

Giả sử bạn có một entity Product, tạo lớp entity:

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual decimal Price { get; set; }
}

Với Fluent NHibernate, tạo lớp mapping cho Product:

using FluentNHibernate.Mapping;

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Table("Products"); // Tên bảng trong cơ sở dữ liệu
        Id(x => x.Id);      // Mapping khóa chính
        Map(x => x.Name);
        Map(x => x.Price);
    }
}

Cấu hình SessionFactory cho NHibernateTạo một lớp helper để cấu hình và xây dựng ISessionFactory:

using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;

public class NHibernateHelper
{
    private static ISessionFactory _sessionFactory;

    public static ISessionFactory SessionFactory => _sessionFactory ??= BuildSessionFactory();

    private static ISessionFactory BuildSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2012
                .ConnectionString("Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProductMap>())
            .BuildSessionFactory();
    }
}

Chú ý: Cập nhật chuỗi kết nối sao cho phù hợp với cấu hình của bạn.

Tích hợp NHibernate vào ASP.NET Core qua Dependency Injection

Trong file Program.cs (hoặc Startup.cs với phiên bản ASP.NET Core cũ hơn), cấu hình DI cho NHibernate:

var builder = WebApplication.CreateBuilder(args);

// Đăng ký ISessionFactory dưới dạng singleton
builder.Services.AddSingleton(NHibernateHelper.SessionFactory);

// Đăng ký ISession với vòng đời scoped (một phiên làm việc cho mỗi request)
builder.Services.AddScoped(factory => NHibernateHelper.SessionFactory.OpenSession());

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Sử dụng NHibernate trong API Controller

Tạo một controller để thực hiện các thao tác CRUD sử dụng NHibernate. Ví dụ, controller cho Product:

using Microsoft.AspNetCore.Mvc;
using NHibernate;
using System.Linq;

[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly ISession _session;

    public ProductsController(ISession session)
    {
        _session = session;
    }

    // GET: api/Products
    [HttpGet]
    public IActionResult GetProducts()
    {
        var products = _session.Query<Product>().ToList();
        return Ok(products);
    }

    // GET: api/Products/5
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
        var product = _session.Get<Product>(id);
        if (product == null)
            return NotFound();
        return Ok(product);
    }

    // POST: api/Products
    [HttpPost]
    public IActionResult PostProduct([FromBody] Product product)
    {
        using var transaction = _session.BeginTransaction();
        _session.Save(product);
        transaction.Commit();
        return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
    }

    // PUT: api/Products/5
    [HttpPut("{id}")]
    public IActionResult PutProduct(int id, [FromBody] Product product)
    {
        if (id != product.Id)
            return BadRequest();

        using var transaction = _session.BeginTransaction();
        _session.Update(product);
        transaction.Commit();
        return NoContent();
    }

    // DELETE: api/Products/5
    [HttpDelete("{id}")]
    public IActionResult DeleteProduct(int id)
    {
        var product = _session.Get<Product>(id);
        if (product == null)
            return NotFound();

        using var transaction = _session.BeginTransaction();
        _session.Delete(product);
        transaction.Commit();
        return NoContent();
    }
}

Một số lưu ý khi sử dụng NHibernate

  • Transaction: Hầu hết các thao tác ghi dữ liệu (Insert, Update, Delete) nên được thực hiện trong transaction để đảm bảo tính toàn vẹn của dữ liệu.
  • Session Management: ISession tương đương với một “kết nối” làm việc với cơ sở dữ liệu. Nên sử dụng vòng đời scoped (một phiên cho mỗi request) để tránh rò rỉ tài nguyên.
  • Mapping: NHibernate hỗ trợ nhiều cách mapping (XML, Fluent). Fluent NHibernate được ưa chuộng vì cú pháp code trực quan và dễ bảo trì.

Kết luận

NHibernate là một ORM mạnh mẽ và linh hoạt, phù hợp với các ứng dụng .NET cần xử lý các mapping phức tạp hoặc yêu cầu cao về cấu hình truy xuất dữ liệu. Việc tích hợp NHibernate vào ASP.NET Core Web API không quá phức tạp; bạn chỉ cần:

  1. Cài đặt các package cần thiết.
  2. Định nghĩa entity và mapping.
  3. Cấu hình SessionFactory và đăng ký trong Dependency Injection.
  4. Sử dụng ISession trong controller để thực hiện các thao tác CRUD.

Hy vọng hướng dẫn này sẽ giúp bạn có cái nhìn tổng quan và bắt đầu áp dụng NHibernate vào dự án của mình. Nếu có bất kỳ thắc mắc hay cần hỗ trợ thêm, bạn cứ thoải mái đặt câu hỏi!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

pzf-icon