This article is dedicated to discussing the latest releases of the NHibernate and Entity Framework. NHibernate is (was?) a number one ORM Framework for ages. Its feature list is growing and some things such as code-based mappings and automatic migrations have found a place in Entity Framework. Moreover, it is now open-source, so they are now accepting pull requests as well.
Entity Framework (http://www.ohloh.net/p/entityframework) at 2013-12-10:
NHibernate (http://www.ohloh.net/p/nhibernate) at 2013-12-10:
Let’s take a look at the above charts. The number of contributors to the NHibernate project declines while the number of Entity Framework contributors increases. There are three times as many commits to the Entity Framework source tree then to the NHibernate. Additionally, the number of commits to the NHibernate sources declined by 56 percent in last 12 months while the number of commits to the Entity Framework increased by 98 percent in the 12 months.
It is evident the NHibernate community has lost steam while Entity Framework’s community is growing and gaining the speed. Perhaps all of the original NHibernate kids have moved on and thus the community is lacking a clear vision for new releases. I guess it also doesn’t hurt that Microsoft sponsors the Entity Framework.
Now, let’s review the new features that were added to the Entity Framework 6 version and upcoming NHibernate 4 release.
Entity Framework 6 new features
NHibernate 4 planed features
You can see that Entity Framework 6 offers quite a few new and interesting features while the NHibernate 4 release just replaces the third party Iesi.Collections library with the native alternative of .NET Framework (no real exciting things here).
Entity Framework (http://msdn.microsoft.com/en- us/data/jj730568#providers at 2013-12-10):
Note #1: If you’re so inclined, you can find more unofficial providers on StackOverflow.com. For example, I was able to install and use Npgsql.EF6 package form NuGet (though it’s the pre-release version: 2.0.12-pre4) to connect to PostgreSQL database.
Note #2: Any inclusion in this list does not indicate the level of functionality or support for a given provider, only that a build for Entity Framework 6 has been made available (quote from MSDN site).
NHibernate (http://community.jboss.org/wiki/DatabasesSupportedByNHibernate at 2013-12-10)
I do need to address the fact that most providers are still broken after the Entity Framework 6 release–provider migration is lagging behind. The same could be said about SQL generators for Code-First Migrations. At this point, only Sql Server providers are in sync with Entity Framework releases. On the other hand, all NHibernate providers are in working condition and new releases don’t break them. In my opinion, NHibernate is the clear winner in this area as many users rely on NHibernate to develop applications for more than one provider.
Both NHibernate and Entity Framework support the Code First Mapping feature. In Entity Framework it was introduced in version 4. However, at that time it received a lot off criticism due to a broken model (http://ayende.com/blog/4246/what-is-up-with-the-entity-framework-vnext, http://ayende.com/blog/4038/why-defer- loading-in-entity-framework-isnt-going-to-work). However, after the version 6 release, it appears that Entity Framework and NHibernate are on equal footing in this particularly area.
Entity Framework
NHibernate
For me, built-in support for migrations is a must-have feature for any modern ORM. That’s why Entity Framework is the clear winner despite the fact that a number of supported SQL generators in Entity Framework migrations are very limited for version 6 at the time of this post.
Entity Framework
NHibernate
As I understand, in order to add asynchronous operations API to NHibernate it would require a major refactoring of code and architecture. So I don’t think that this will be added to NHibernate any time soon. Because of this, Entity Framework comes out on top in this category. However, it remains to be seen how useful programmers will find this feature.
Entity Framework
NHibernate
Entity Framework
NHibernate
Again, it is one of those NHibernate contradictions - Loquacious Configuration API is included in the core but the third-party FluentNHibernate library is more widely used. I don’t understand why NHibernate developers have not fixed this and included the FluentNHibernate into the core since FluentNHibernate existed before Loquacious Configuration API was introduced. Instead they chose to write new API. I think in this area both frameworks are fairly equal, though NHibernate loses some points because it is unclear that API should be used.
Entity Framework
NHibernate
Per usual with NHibernate, its flexibility is its strongest and weakest point. Since it supports so many querying API’s not all of those are equally matured. For a novice user, it can be unclear which query API to use. For example, when the LINQ provider was introduced it was very unstable and many methods were not implemented at all. At the same time, Query Over API was introduced. So, what is the advantage? There is always more than one way to do querying and if you don’t like using one API you can always use another (or mix them)–We like choices. Contrarily, I think a novice user may like that in Entity Framework all decisions are already made by the framework developers. Overall, NHibernate is a bit more flexible and offers QueryOver API (almost SQL like feel). Additionally, NHibernate has a unique ability to merge several separate queries into one batch by its Futures feature. Despite NHibernate offering a few more features than Entity Framework, I don’t think we can say one is a clear winner.
Illustrated below is a simple database schema we will perform queries against:
We will query a root entity with the child collections.
Entity Framework Linq API
1
2
3
4
5
6
7
8
9
10
11
12
|
using
(var db =
new
SchoolContext())
{
var students = db.Students
.Include(s => s.Enrollments)
.Include(s => s.Enrollments.Select(e => e.Course))
.Where(s => s.LastName !=
null
)
.OrderBy(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.Skip(1)
.Take(3)
.ToList();
}
|
Nhibernate Linq API
1
2
3
4
5
6
7
8
9
10
11
12
13
|
using
(var session = sessionFactory.OpenSession())
{
var students = session.Query<student>()
.FetchMany(s => s.Enrollments)
.ThenFetch(e => e.Course)
.Where(s => s.LastName !=
null
)
.OrderBy(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.Skip(1)
.Take(3)
.ToList();
}
</student>
|
NHibernate QueryOver API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Student studentAlias =
null
;
Enrollment enrollmentAlias =
null
;
Course courseAlias =
null
;
using
(var session = sessionFactory.OpenSession())
{
var = session.QueryOver(() => studentAlias)
.Left.JoinAlias(() => studentAlias.Enrollments, () => enrollmentAlias)
.Left.JoinAlias(() => enrollmentAlias.Course, () => courseAlias)
.Where(() => studentAlias.LastName !=
null
)
.OrderBy(() => studentAlias.FirstName).Asc
.OrderBy(() => studentAlias.LastName).Desc
.TransformUsing(Transformers.DistinctRootEntity)
.Skip(1)
.Take(3)
.List<student>();
}
</student>
|
Entity Framework
NHibernate
The goal for the interception feature is to allow external code to observe and potentially intercept framework operations.The very clear winner in this area is NHibernate, since its interception/event capabilities are richer (currently Entity Framework only supports interception of DbCommand execution and DbCommandTree creation)
NHibernate falls badly behind with regard to documentation because its process is outdated and resources for learning are scattered all over the Internet. Not only is it difficult for the user to locate information on how to use the framework but it is difficult to know what to search for (for example what query API is recommended). Conversely, Entity Framework has centralized place for learning about it with up-to date tutorials included.
A few years ago if someone would have asked me what ORM framework I would recommend for a .NET project I would have said NHibernate. However in today’s tech landscape, NHibernate falls behind Entity Framework. I don’t necessarily believe its worth switching from NHibernate to Entity Framework if you have experience with the former. However, if you are a novice developer, Entity Framework may be easiest to learn. Ultimately, the choice is yours.
from:http://www.devbridge.com/articles/entity-framework-6-vs-nhibernate-4