.net - studio - NHibernate en DB heredado
nhibernate visual studio 2015 (8)
Me da vergüenza decirlo, pero tengo que hacerlo. No he trabajado con ORM''s. Realmente estoy considerando NHibernate, ya que parece ser el producto más maduro para .Net (corrígeme si me equivoco). Ahora, el caso es que tenemos un gran sistema de comercio electrónico / reservas con un SqlServer como punto de integración principal, que contiene bastante lógica comercial en sprocs. Ahora, obviamente, esta arquitectura es algo de lo que queremos alejarnos, y lo hemos estado haciendo durante algún tiempo, pieza por pieza. Entonces, mi verdadera pregunta es ¿qué tan factible es comenzar a usar NHibernate para nuevas características y no volver atrás y mapear todo el material heredado? ¿Este tipo de introducción gradual de ORM es compatible, y si es así, lo recomendaría?
¿Por qué los procesos almacenados "obviamente" son malos? ¿La lógica comercial en los procesos almacenados causa dolor?
Parece que Microsoft tiene varias tecnologías de persistencia disponibles (por ejemplo, LINQ). No sé cómo evaluarlos frente a NHibernate, pero no recomendaría ORM a menos que tenga objetos realmente buenos para mapear.
Cualquier herramienta de ORM decente debería ser compatible con la integración gradual. El truco aquí es tener una separación clara en el nivel DAO (capa de Objeto de Acceso a Datos). Si puede ocultar sus peculiaridades de acceso a los datos por medio de una API bien definida, no debería importar si está usando un ORM o no.
Habiendo dicho eso, la complejidad de la introducción de ORM está directamente relacionada con la complejidad de sus modelos de tabla. Puede tener muchas asignaciones diferentes para las mismas tablas, solo asegúrese de hacer algunas pruebas de antemano para conocer los caprichos de una solución ORM como tener un caché de objetos, consultas de escritura retrospectiva, acceso por proxy y tal. El beneficio real de una solución ORM es usar objetos en lugar de clases POJO ficticias. Esto hace que hacer cambios en el negocio sea mucho más fácil que usar sprocs u objetos planos.
Como nota al margen, trabajé en un proyecto donde migramos una aplicación completa en sprocs a Java. Aunque no usamos un sproc, el verdadero dolor fue que la arquitectura de sprocs no estaba bien definida, y muchos sprocs que llamaban a otros sprocs hicieron que sea muy difícil migrar solo algunos sprocs a la vez.
Dependerá de cómo sea "NHibernate amigable" su base de datos actual. A NHibernate le gustan las claves primarias de una sola columna (si todas se llaman "id", aún mejor). La mayoría de los ORM no son muy amigables para el proceso de almacenamiento, por lo que sé. ¿Pensó en cómo va a definir sus objetos de transferencia para obtener datos del DB desde y hacia adelante?
Por cierto, no hay nada de qué avergonzarse. Los ORM son una tontería, pero tienes razón al tratar de encontrar el mejor enfoque.
No hay nada dentro de NHibernate que le impida hacer esto. En algún momento, es probable que desee convertir su código heredado para usar también NHibernate, ya que no verá todos los beneficios de un ORM hasta que pueda navegar por las relaciones entre todos sus objetos.
El mayor desafío con esto puede ser conseguir que sus estructuras de tablas heredadas se ajusten a la metodología de mesa única por clase de NHibernate. Hay formas de evitar esto, pero puede ser complicado. Aún así, creo que vale la pena.
No he hecho esto personalmente, pero puede copiar y pegar los procedimientos almacenados en consultas con nombre en sus archivos de mapeo, y eliminarlos uno por uno más adelante.
Si no tiene experiencia con los ORM, probablemente sea difícil comenzar a aprenderlo en un gran proyecto heredado, ya que debe descubrir todas las características no estándar del ORM que no usaría en proyectos totalmente nuevos, o usar solo una vez al año. NHibernate tiene muchas opciones para admitir bases de datos heredadas.
Cuando está preparado para cruzar la curva de aprendizaje y lo suficientemente valiente como para comenzar a usar una nueva tecnología, puede comenzar con NHibernate, pero si quiere aprender nuevas tecnologías paso a paso, esperaría con NHibernate hasta que inicie un nuevo proyecto totalmente nuevo.
Si está utilizando bases de datos heredadas, encontrará que las herramientas ORM son bastante difíciles de usar, configurar, mantener y optimizar. Nos encontramos con muchos problemas cuando utilizamos NHibernate para asignar nuestro Modelo de dominio a una base de datos existente. Algunos de ellos fueron:
Los objetos del Modelo eran difíciles de mapear a las tablas existentes (teníamos más de 100 tablas), algunos de los requisitos de NHibernate eran bastante molestos como que cada tabla debe tener un campo ID para poder mapearse en un objeto de Dominio. Además, el mapeo de muchas a muchas relaciones era bastante difícil de comprender y usar.
El mantenimiento del gran volumen de asignación de XML requerido para el mapeo de la base de datos heredada se convirtió en un trabajo de tiempo completo para un desarrollador y fue todo un reto, especialmente en un equipo de más de 10 desarrolladores.
Nuestras consultas se degradaron en rendimiento a medida que crecía la complejidad, ya que el modelo de datos y el modelo de objetos no siempre coincidían con el negocio y necesitaban estar constantemente sintonizados. Se tuvo que escribir una gran cantidad de código de agregación de datos. Por ejemplo, si necesitábamos mostrar una grilla que uniera varias tablas, solíamos tener que cargar varios objetos de Dominio, juntarlos y mostrarlos en una grilla. Ese código era difícil de mantener y depurar.
Además, a veces teníamos que ejecutar consultas anónimas, es decir, cuando solo queríamos algunas propiedades de algunos objetos y no de objetos completos. Eso fue realmente difícil de escribir, mantener e incluso implementar y estaba yendo en contra del paradigma de ORM, pero no tuvimos más remedio que hacerlo.
Otro problema con el que nos topamos fue que la base de datos cambiaba constantemente ya que los DBA refactorizarían las tablas y eso siempre rompería nuestros objetos de dominio. Fue un ejercicio mantener sincronizados los Modelos y las Tablas y también asegurarnos de que la Aplicación aún funcionara.
Una larga historia corta ... Lo que aprendimos fue que si hubiera una forma de mapear el SQL que la empresa necesitaba directamente en nuestros objetos UI Model u Domain sin tener que preocuparse por la configuración, sería una mejor solución.
Después de pasar por esta experiencia desarrollamos el Orasis Mapping Studio. Es una herramienta de mapeo diseñada específicamente para trabajar contra bases de datos heredadas y también con objetos existentes del Modelo / Dominio .NET. Toma tus consultas SQL y te permite mapearlas a tus objetos .NET existentes al mostrar gráficamente los metadatos de la Consulta y el Objeto y usando arrastrar y soltar para crear asignaciones entre las propiedades del Objeto y las columnas de Consulta. La herramienta genera automáticamente todo el código ADO.NET que necesitaría para realizar su asignación para leer sus objetos. Luego puede usar el código generado en su Capa DAL o usar el Ensamblaje generado para recuperar y conservar sus datos.
Puede intentarlo aquí: Orasis Mapping Studio . Es una herramienta que creemos que los desarrolladores realmente necesitan, especialmente para trabajar con bases de datos heredadas y donde el rendimiento es un requisito clave. Está escrito por desarrolladores para desarrolladores, por lo que maneja algunos de los detalles intrincados como herencia de Obejct, objetos anidados, conversiones de tipos de datos, etc. ¡Buena suerte!
Usted mencionó que se está alejando de su arquitectura actual, pero ¿está obligado a seguir con su diseño de base de datos heredado (por ejemplo, un DBA es estrictamente responsable de diseñarlo y mantenerlo) o se está refactorizando su diseño actual de la base de datos (considerando O / R mapper) también?
Si es difícil alejarse de su diseño heredado actual, probablemente podría considerar buscar en otra entidad, como iBATIS SqlMap, entidades de mapas O / R en su base de datos heredada mediante simples consultas antiguas de T-SQL, en lugar del estilo Hibernate menos flexible. XML / atributos para mapear datos.
Dependiendo de cómo quiera acercarse al diseño, puede usar iBATIS SqlMap y NHibernate de forma transparente uno al lado del otro, haciendo uso de su propia fábrica abstracta de DAO , o la API de iBATIS DataAccess (que básicamente hace eso, y sigue siendo compatible con NHibernate.)
Estoy de acuerdo con lo que dijo Ahmad, he enfrentado problemas similares en el pasado. La mayoría de los problemas no provienen de la tecnología en sí, sino de su adopción por parte de los desarrolladores, cambiar a NHibernate implica cambios en los hábitos de trabajo, por decir lo menos, y esto no siempre es fácil.
Si es nuevo en ORM, probablemente sea mejor comenzar un proyecto nuevo que tratar de convertir un proyecto heredado.
Mi consejo para convertir un proyecto heredado a ORM sería tratar de usar algún tipo de herramienta de generación como LLBGen o .netTiers o incluso Linq2SQL. De esta forma, podría sentirse un poco más cómodo con ORM sin la reescritura traumática que NHibernate podría imponer.