beginor / nhibernate-extensions

NHibernate Extensions for .NET Core
GNU Lesser General Public License v2.1
19 stars 5 forks source link

Some useful extensions for NHibernate

Some useful extensions for NHibernate used in my projects.

NHibernate.Extensions.Npgsql

Refer ArrTestEntity for mapping, and ArrTest for sample query usage;

NHibernate.Extensions.Sqlite

NHibernate driver for the Microsoft.Data.Sqlite.Core data provider for .NET.

In order to use this driver, you must have the nuget package Microsoft.Data.Sqlite.Core and SQLitePCLRaw.bundle_e_sqlite3 installed for NHibernate to load.

It's a .NET Standard 2.0 Driver, Can run on any platform that dotnet core support.

NHibernate.NetCore

Extensions for NHibernate when used in dotnet core:

Example usage:

public void ConfigureServices(IServiceCollection services) {
    // where is your hibernate.config path
    var path = System.IO.Path.Combine(
        AppDomain.CurrentDomain.BaseDirectory,
        "hibernate.config"
    );
    // add NHibernate services;
    services.AddHibernate(path);
}

public void Configure(
    IApplicationBuilder app,
    IHostingEnvironment env,
    Microsoft.Extensions.Logging.ILoggerFactory loggerFactory
) {
    // Use loggerFactory as NHibernate logger factory.
    loggerFactory.UseAsHibernateLoggerFactory();
    /* other code goes here */
}

And then use ISessionFactory in your controller:

[Route("api/[controller]")]
public class SamplesController : Controller {

    private ISessionFactory sessionFactory;

    public SamplesController(ISessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    protected override void Dispose(bool disposing) {
        if (disposing) {
            sessionFactory = null;
        }
    }

    [HttpGet("")]
    public async Task<IList<Sample>> GetAll() {
        try {
            using (var session = sessionFactory.OpenSession()) {
                var result = await session.Query<Sample>().ToListAsync();
                return result;
            }
        }
        catch (Exception ex) {
            return StatusCode(500, ex.Message);
        }
    }
}

Or just use ISession in your controller:

[Route("api/[controller]")]
public class SamplesController : Controller {

    private ISession session;

    public SamplesController(ISession session) {
        this.session = session;
    }

    protected override void Dispose(bool disposing) {
        if (disposing) {
            session = null;
        }
    }

    [HttpGet("")]
    public async Task<IList<Sample>> GetAll() {
        try {
            var result = await session.Query<Sample>().ToListAsync();
            return result;
        }
        catch (Exception ex) {
            return StatusCode(500, ex.Message);
        }
    }
}