for - Mejores prácticas para consultar con NHibernate
no persister for fluent nhibernate c# (5)
La cosa con LINQ para NHibernate todavía está en beta; Estoy esperando NHibernate 2.1, donde dicen que finalmente hará el corte.
Hice una presentación sobre LINQ para NHibernate hace aproximadamente un mes, puede que le resulte útil. Publiqué sobre esto aquí, incluyendo diapositivas y código:
LINQ para NHibernate: Asignación O / R en diapositivas y código de Visual Studio 2008
He vuelto a usar NHibernate después de usar otras tecnologías ( CSLA y Subsonic ) durante un par de años, y estoy encontrando las consultas un poco frustrantes, especialmente cuando se compara con Subsonic. Me preguntaba qué otros enfoques usan las personas.
El lenguaje de consulta de Hibernate no me parece correcto, se parece mucho a escribir SQL, que en mi opinión es una de las razones para usar una herramienta ORM, así que no es necesario, además está todo en XML, lo que significa que es pobre para la refactorización, y los errores solo se descubrirán en el tiempo de ejecución?
Consultas de criterios, no parecen lo suficientemente fluidas.
He leído que el NHibernate Query Generator de Ayende es una herramienta útil, ¿es esto lo que las personas están usando? ¿Qué más hay?
EDIT: vale la pena leer http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx
Para deshacerte del XML, prueba Fluent NHibernate
Linq2NH aún no está completamente horneado. El equipo central está trabajando en una implementación diferente a la de NH Contrib. Sin embargo, funciona bien para consultas simples. Úselo con moderación para obtener los mejores resultados.
En cuanto a cómo consultar (hql vs. Criteria vs. Linq2NH), exponer los métodos de revelación de intenciones ( GetProductsForOrder(Order order)
, GetCustomersThatPurchasedProduct(Product product)
, etc.) en su interfaz de repositorio e implementarlos de la mejor manera. Las consultas simples pueden ser más fáciles con hql, mientras usa el patrón de especificación, puede encontrar que la API de Criterios se ajusta mejor. Eso solo queda encapsulado en su repositorio, y si pasan sus pruebas, no importa mucho cómo lo implemente.
Descubrí que la API de Criteria es engorrosa y limitante, pero flexible. HQL es más mi estilo (y es mejor que SQL, está basado en objetos, no en el esquema) y parece funcionar mejor para mí con métodos simples de GetX.
Yo uso Linq para NHibernate por defecto. Cuando toco errores o limitaciones, cambio a HQL.
Es un enfoque limpio si mantiene todas sus consultas juntas en una clase de acceso a datos, como un repositorio.
public class CustomerRepostitory()
{
//LINQ for NHibernate
public Customer[] FindCustomerByEmail(string email)
{
return (from c in _session.Linq<Customer>() where c.Email == email).FirstOrDefault();
}
//HQL
public Customer[] FindBestBuyers()
{
var q = _session.CreateQuery("...insert complex HQL here...");
return q.List<Customer>();
}
}
Usted preguntó por la refactorización. El IDE se ocupa de LINQ, por lo que para cualquier HQL restante, es bastante fácil escanear estas clases de repositorio y cambiar HQL a mano.
Poner HQL en archivos XML es una buena práctica, tal vez ver si el plugin ReSharper NHIbernate puede manejar la refacturación de consultas por ahora.
Una gran mejora al escribir o refactorizar consultas (HQL o LINQ) es poner los métodos del buscador bajo prueba unitaria . De esta manera, puede ajustar rápidamente el HQL / LINQ hasta que obtenga una barra verde. El ciclo de compilación / prueba / retroalimentación es muy rápido, especialmente si utiliza una base de datos en memoria para realizar pruebas.
Además, si olvida editar el HQL después de la refactorización, las pruebas unitarias deberían informarle acerca de su HQL roto muy rápidamente.
deseche nHibernate y regrese a Subsonic si puede. En mi opinión, Subsonic es un ORM / DAL mucho más fluido y comprobable. Odio absolutamente a HQL ¿cuál es el punto de una consulta débilmente tipada en un ORM? ¿Y por qué debería usar Linq / nH / SQL cuando puedo usar Linq para SQL y cortar una capa?
nHibernate era un buen ORM cuando Subsonic no estaba presente, pero ahora es simplemente horrible trabajar en comparación. Me cuesta 2 veces más hacer cosas con nHibernate vs Subssonic. Las pruebas son un problema ya que nHibernate es el tiempo de ejecución, por lo que ahora necesito emplear algunos ingenieros de control de calidad para hacer "clic" en el sitio en lugar de obtener un error de tiempo de compilación.
Una alternativa a LINQ-a-NHibernate y NHQG de Ayende es generar NHibernate Expressions / Restrictions from C # 3 Expressions. De esta forma, obtienes una API de criterios con mayor fuerza.
Ver: