What is NHibernate?
Obviously, it is an ORM. If I may quote from the NHibernate website:
"NHibernate is a mature, open source object-relational mapper for the .NET framework. It's actively developed, fully featured and used in thousands of successful projects."
NHibernate is a .NET port of a very famous ORM from the Java land called Hibernate. Now, Hibernate is quite old and is used by thousands of production applications. NHibernate has not only inherited most of the good features from its Java ancestor but has also been enriched with features from .NET, such as LINQ queries. To understand how powerful it can be, let's take a very simple example. If you have the Customer
class from the previous section, mapped to a database table called tblCustomer
, and you want to fetch all customers between 28 and 35 years of age, then with NHibernate, you can write something as follows:
var customers = from c in session.Query<Customer>() where c.Age > 28 && c.Age < 35 select c;
This is an LINQ query written in C#. LINQ stands for Language-Integrated Query. This is a feature introduced in C# and Visual Basic that offers data query and update syntax, which is similar to SQL. LINQ works against a variety of data sources but within the constraints of the C# language; further, it works nicely with the IQueryable
types. If you are not familiar with LINQ, then do not worry too much as we will cover them in the coming chapters. You must be wondering what is session.Query<Customer>()
? This is an NHibernate API that we will use extensively throughout this book. For now, session.Query<Customer>()
returns IQueryable<Customer>
. It is this queryable type that makes writing the previous LINQ query possible.
NHibernate then processes the previous LINQ query and generates the following SQL:
SELECT a_.FirstName, a_.LastName, a_.EmailAddress, a_.Age FROM tblCustomer a_ WHERE a_.Age > 28 AND a_.Age < 35
As you can see, all you wrote was a simple C# LINQ expression against a C# class. You did not have to think about what the database table name is and how to form the correct SQL query; NHibernate has handled all of that for you. NHibernate has a lot of such features that will make writing database interaction code a breeze. We are going to cover these features of NHibernate throughout this book.
NHibernate is an open source project which prospers entirely on community contributions. As with any open source project, this gives a lot of transparency to every aspect of NHibernate. You can download the source code from their GitHub repository at https://github.com/nhibernate/nhibernate-core/ and check out how things are implemented. You can raise bugs on their official JIRA board, contribute to discussions around the right fixes for the defects, development of new features, and the future roadmap. All these activities are mostly led by a few top contributors, but transparency and community inclusion are what keep NHibernate going. You can access the NHibernate JIRA board by navigating to http://nhibernate.jira.com. I will not spend too much space talking about NHibernate here. Besides the fact that the whole book covers all important aspects of NHibernate anyway, I am now going to peek into some interesting NHibernate features in the remaining sections of this chapter.
Before I move onto the next section, I would like to mention that the latest stable version of NHibernate is 4.0.3.400 as of the time of writing of this book. The latest version of NHibernate can be confirmed by visiting the NuGet page of NHibernate at https://www.nuget.org/packages/NHibernate/. The latest version is an important milestone since this a major release that has come about 3 years after the previous major release 3.0. There were several minor releases in these 3 years. All these releases have collectively added a lot of great features to version 4.0 of NHibernate. Let's take a brief tour of these features.