Some useful extensions for NHibernate used in my projects.
Extended PostgreSQL driver NpgsqlDriver for NHibernate, with support of:
json
and jsonb
boolean
, double
, float (real)
, int
, short (small int)
, long (big int)
and string (character)
;array_contains
and array_intersects
function to hql query;ArrayContains
and ArrayIntersects
extension to linq query;Extended PostgreSQL dialect NpgsqlDialect for schema export of supported types.
Refer ArrTestEntity for mapping, and ArrTest for sample query usage;
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.
Extensions for NHibernate when used in dotnet core:
Microsoft.Extensions.Logging.ILoggerFactory
as NHibernate's logger factory;AddHibernate
method for integration with IServiceProvider
;OrderBy(string propertyName)
, OrderByDescending(string propertyName)
and
AddOrderBy(string propertyName, bool isAsc)
extension methods to IQueryable<T>
,
make fun with dynamic order by.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);
}
}
}
ISessionFactory
is registerd as a singleton service, you should not dispose it;ISession
is registerd as a scoped service, so you do not need to dispose it by hand;