martes, 22 de febrero de 2011

Entity Framework vs NHibernate

image

A la hora de trabajar con bases de datos, últimamente los programadores tendemos a simplificarnos la vida (somos unos vagos, XD) y solemos usar algún ORB para mapear la base de datos y no pelearnos directamente con SQL.

En Java prácticamente no hay rival: a todo el mundo le gusta Hibernate. Sin embargo, en C# hay dos alternativas: NHibernate y Entity Framework.

Los lectores más avispados os habréis dado cuenta de que NHibernate no es más que la versión de .NET de Hibernate: aquel ORB tan famoso para Java.

En cambio, Entity Framework es de Microsoft, y se trata de la evolución natural de ADO.NET. Al ser de MS, se integra muy bien con las tecnologías .Net, como Visual Studio, C#, SQL Server, etc…

En la siguiente tabla podemos ver una tabla comparativa de rendimiento de ambas tecnologías:

image

Viendo esta grafica, seguramente habréis pensado “me quedo con NHibernate”. Pues si, no está mal, pero debo matizar que la nueva versión de Entity Framework 4.0 ha mejorado mucho, y que a la hora de trabajar, EF es mucho más cómodo y sencillo para el desarrollador. Luego, cada uno se siente cómodo con una tecnología y eso sólo lo puedes saber después de probar las dos.

Si queréis ver las graficas comparativas, y obtener el código fuente de las pruebas para testearlos vosotros mismos, podéis leer el informe completo en la siguiente web: http://gregdoesit.com/2009/08/nhibernate-vs-entity-framework-a-performance-test/

3 comentarios:

  1. Bueno, pero entonces cual recomendáis? Habéis trabajado con ambos?

    ResponderEliminar
  2. Yo recomiendo la ultima versión de EF de cabeza. Se integra a la perfección con Visual Studio 2010, es más intuitivo y además de que ya viene integrado con VS2010.

    Aunque lo suyo es que pruebes los dos y te quedes con el que más te guste

    ResponderEliminar
  3. http://ayende.com/blog/4351/nhibernate-vs-entity-framework-4-0

    Here is a small list:

    Write batching – NHibernate can be configured to batch all writes to the database so that when you need to write several statements to the database, NHibernate will only make a single round trip, instead of going to the database per each statement.
    Read batching / multi queries / futures – NHibernate allows to batch several queries into a single round trip to the database, instead of separate roundtrip per each query.
    Batched collection loads – When you lazy load a collection, NHibernate can find other collections of the same type that weren’t loaded, and load all of them in a single trip to the database. This is a great way to avoid having to deal with SELECT N+1.
    Collection with lazy=”extra” – Lazy extra means that NHibernate adapts to the operations that you might run on top of your collections. That means that blog.Posts.Count will not force a load of the entire collection, but rather would create a “select count(*) from Posts where BlogId = 1” statement, and that blog.Posts.Contains() will likewise result in a single query rather than paying the price of loading the entire collection to memory.
    Collection filters and paged collections - this allows you to define additional filters (including paging!) on top of your entities collections, which means that you can easily page through the blog.Posts collection, and not have to load the entire thing into memory.
    2nd level cache – managing the cache is complex, I touched on why this is important before, so I’ll skip if for now.
    Tweaking – this is something that is critical whenever you need something that is just a bit beyond what the framework provides. With NHibernate, in nearly all the cases, you have an extension point, with EF, you are completely and utterly blocked.
    Integration & Extensibility – NHibernate has a lot of extension projects, such as NHibernate Search, NHibernate Validator, NHibernate Shards, etc. Such projects not only do not exists for EF, but they cannot be written, for the most part, because EF has no extension points to speak of.
    On the other side, however:

    EF 4.0 has a better Linq provider than the current NHibernate implementation. This is something being actively worked on and the NH 3.0 will fix this gap.
    EF is from Microsoft.

    ResponderEliminar