tablas relacionales relacional que persistencia objetos objeto mapeo ejemplos ejemplo datos capa c# .net orm persistence poco

c# - relacionales - que es capa de persistencia



ORM/Consejo de capa de persistencia (11)

¿Ha pensado en utilizar una base de datos orientada a objetos como db4o ? Aunque nunca lo he usado, lo encontré bastante interesante cuando lo descubrí:

Admite la consulta LINQ, utiliza POCO y, si entendí correctamente, los datos simplemente se almacenan en un archivo (no se requiere la instalación de una base de datos).

Algunos enlaces: tutorial , post de foro

Estoy empezando un nuevo proyecto y estoy buscando un ORM muy bueno o una capa de persistencia no basada en SQL.
Para este proyecto, realmente no me importa cómo se conservan los datos, siempre que puedan consultarse y almacenarse con una velocidad razonable y, lo que es más importante, con consultas simples.
La concurrencia debe manejarse a la perfección (el front-end estará en otro nivel y habrá varios usuarios simultáneos, aunque no necesariamente trabajando en los mismos datos) y cuanto menos tenga que concentrarme en la capa de datos (consultas fáciles, perezoso automático cargando etc) mejor.
También quiero evitar a toda costa tener que meterme con consultas basadas en cadenas para que las herramientas que soportan LINQ o las consultas intuitivas y posiblemente tipificadas obtengan una gran ventaja.
Finalmente, trabajar con objetos POCO es otra cosa que realmente quiero hacer.
Aquí hay una lista de productos que he evaluado y por qué no encajan, solo para que no vea ningún consejo sobre cómo usarlos:

  • NHibernate: cosas xml locas, demasiada configuración, alta complejidad de mantenimiento y costo para los cambios de modelo, las fábricas de sesiones son complicadas y no se adaptan bien a mis necesidades
  • Castle ActiveRecord: basado en NHibernate, todavía se aplica poca documentación y algunos problemas relacionados con NHibernate. Además, para obtener modelos decentes se necesitan tantos atributos que es mejor crear el esquema manualmente, y la forma en que se manejan las relaciones es una vergüenza.
  • Linq To SQL: faltan objetos POCO y, según MS, no mejorarán las horas extraordinarias (EF es lo que están comprometidos)
  • Entity Framweork: aunque en v4 los objetos POCO son posibles, todavía son bastante intrépidos y te obligan a hacer demasiado trabajo manual para configurar las cosas. Además, v4 es solo una beta.
  • LLBLGen Pro: bueno, especialmente con adaptadores de autoservicio, pero no con POCO. Además, el proveedor de LINQ aún no es perfecto. Finalmente, eliminar un grupo de objetos no es posible a través de LINQ, lo que resulta en la mezcla de API (una de las cuales está lejos de ser intuitiva) y eso no me gusta.
  • XPO: cualquier cosa menos intuitiva, muy lenta, problemas de concurrencia, no POCO
  • SubSonic SimpleRepository: durante unos minutos pensé que estaba soñando. El equipo llegó a su fin cuando descubrí cómo la cosa no manejaba las relaciones.

También observé MongoDB y CouchDB, pero en esos casos, las capturas con objetos relacionados parecían requerir demasiadas pruebas antes de hacer las cosas bien. Además ninguno de ellos ofrece consultas fuertemente tipadas.

¡Gracias por adelantado por tus sugerencias!


Con todo respeto, tiendo a estar totalmente en desacuerdo con su evaluación de las debilidades de NHibernate.

Creo que los mapeos XML son extremadamente simples e intuitivos de crear. Agregar una referencia a NHibernate.dll y crear SessionFactory también es pan comido. El mantenimiento y la gestión del cambio se simplifica significativamente. Las fábricas de sesiones y las sesiones son muy fáciles de entender y tratar.

En general, creo que estás siendo emocional y no racional con tu evaluación.


Echa un vistazo a DataObjects.Net :

Ventajas:

  • Modelo de negocio fácil de diseñar usando clases y atributos simples
  • El esquema de la base de datos se genera automáticamente en tiempo de ejecución, por lo que no tiene que preocuparse por cómo se conservan los datos
  • Carga perezosa automática, persistencia transparente, etc ...
  • Muy buena implementación de LINQ
  • Alto rendimiento

Desventajas:

  • No POCO

Echa un vistazo a EntitySpaces . No puedo recomendarlo desde mi propia experiencia personal, pero funciona muy bien para uno de mis colegas (a quien no le gusta el software ...)


Echa un vistazo a Aspectize here


He utilizado LLBLGenPro, NHibernate y algunas bases de datos de objetos.

Mi primera recomendación sería que NHibernate con FluentNhibernate maneje los mapeos.

Descubrí que el 90% de la dificultad relacionada con el uso de NHibernate estaba directamente relacionada con las asignaciones XML. Cuando cambié el FluentNhibernate, el dolor desapareció.

El otro 10% de la dificultad es simplemente la ignorancia; No lo entendi Y eso no es culpa de NHibernate.

LLBLGenPro: No tengo idea de cómo es el soporte de Linq ahora, pero antes de que se admitiera a Linq, era un PITA para escribir consultas. Leí los documentos y lo obtuve, pero mis compañeros no lo hicieron y se quejaron sin cesar de las complejidades de los caminos de búsqueda previa y similares. Además, como dijiste, no POCO. Agregue el costo y diría que es mucho más problema de lo que vale.

Si no es una arquitectura cliente-servidor, sugeriría db40. Lo usé en un pequeño proyecto privado y me encantó. Fácil de usar. Gran pequeña base de datos de objetos.


LLBLGen.

Si crees que vas a encontrar algo que cumple todos tus requisitos, entonces puedes estar esperando por mucho tiempo.


Para mí, la respuesta ha resultado ser LLBLGen Pro. Además de sus capacidades, obtiene un equipo de soporte dedicado que se preocupa por ayudarlo a hacer que su proyecto funcione y si descubre un error, en la mayoría de los casos, obtendrá una solución en horas o días. Esto no se puede minimizar, ya que le permite continuar su trabajo en lugar de esperar un lanzamiento (¿meses?) O corregir el error usted mismo.


Podrías echar un vistazo a Telerik ORM . No lo he usado en producción, pero estaba basado en un ORM / ODB de Java llamado POET que me funcionó muy bien hace varios años. Dado que utiliza la mejora de ensamblaje, ofrece una experiencia mucho más transparente que algunos de los productos que rechazó anteriormente.

En términos de un puro ODB FastObjects by Versant probablemente vale la pena echarle un vistazo.

Buena suerte, háganos saber con qué decide ir.


Si puedes pagar la licencia de LLBLGen, hazlo.

En serio, no me gusta la sintaxis de consulta LINQ cuanto más trabajo con ella (aunque AMO las características del lenguaje relacionadas con ella, como los Métodos de Extensión y los Árboles de Expresión).

Al principio me encantaba como todo el mundo, pero no estaba seguro de si [[donde employee.Name.StartsWith ("John Smit")] en ese proveedor XYZ LINQ se realizará en la declaración SQL o en LINQ to Objects (después de que el SQL devuelva todo resultados), y si [[user.Roles.Contains (role)]] funcionará o no es un gran paso atrás.

LLBLGen puede hacer que eliminar todos los elementos sin cargarlos sea tan fácil como

MyEntityCollection.DeleteAll( new MyEntity {Condition = value} );

Esto es bastante simple y me gusta. Obtiene una carga perezosa y configura una carga ansiosa / profunda de forma predeterminada y / o por consulta utilizando la API de Prefetch. Puede componer y construir dinámicamente (y fácilmente) cualquier filtro / clasificación / carga en niveles infinitos. Es muy bonito.

LLBLGen tiene solo dos problemas: primero, el precio no es el que a todas las empresas les gustaría pagar, especialmente teniendo en cuenta el bombo que las alternativas de Microsoft tienen. En segundo lugar, la convención de nomenclatura, aunque estándar en las teorías RDBMS, como PredicateFactory en lugar de "where" o "filter" y Prefetch en lugar de la carga profunda e incluso SortExpression en lugar de orderby, todos estos son un poco de miedo para un desarrollador que trabaja con ella por primera vez veces, pero pronto aprendes a amarlos, dado el poder y la facilidad que dan. Hay charlas sobre el soporte de POCO en LLBLGen 3.0. No puedo contarlo porque no lo sé.

Ahora, dado que ya no trabajo en una compañía que usa LLBLGen, la compañía usa LINQ para SQL principalmente porque está "comprobada" en muchos proyectos sin grandes fallas (a diferencia de EF 1, que carece incluso de las características de LINQ en LINQ para SQL y tiene muchas mal desempeño y puede ser bastante limitante en el mapeo avanzado - ¡lo que debería ser mejor para!). Utilicé tanto en esta empresa y odié a los dos. La decisión para los nuevos proyectos siguió siendo LINQ to SQL, y haciendo todo lo posible para superar sus limitaciones. Este sitio web se ejecuta en la parte superior de él! Puede solucionarlo para hacer SEMI-POCO (aún necesita usar algunos tipos relacionados con L2S cuando se trata de asociaciones).

También hago algunos pequeños proyectos en casa. Como ya no tengo la licencia LLBLGen, decidí aprender NHibernate y usarlo junto con Fluent NHibernate y LINQ To NHibernate. He aprendido a través de esto que NHibernate es MUY fuerte. Cambió mi forma de trabajar con algunas características, como actualizar el esquema de base de datos automáticamente (nunca toqué la D casi cuando lo uso). El proveedor de LINQ (en el proyecto NHibernate Contrib) es bastante deficiente a veces, pero el código fuente no publicado de NHibernate contiene un mejor proveedor de LINQ (aún no lo he probado). La "Sesión" en NHibernate tiene problemas al realizar un desarrollo web similar a los relacionados con DataContext en L2S o ObjectContext en EF (LLBLGen no sufre de estos gracias a las entidades de seguimiento automático).

El mayor problema que tuve con NHibernate fue la capacidad de encontrar información. Demasiadas piezas que se deben juntar de cierta manera y no mucha orientación pueden incluir información avanzada para el mapeo y la consulta. Si no tuviera un amigo (Tuna Toksoz, @tehlike en twitter) que resultó ser un interlocutor en el código fuente del proyecto NHibernate, realmente estaría en serios problemas.

La moraleja que aprendí fue: si quieres algo que simplemente funciona y un poco básico usa Linq To Sql o SubSonic, si quieres algo en el medio y tu entorno de producción puede permitirse la versión BETA .NET (dado que existe golive) usa Entity Framework 4.0 Si desea algo muy poderoso y puede permitirse el lujo del proceso de aprendizaje, vaya a NHibernate Y, LO MEJOR DE TODOS, si puede permitirse el lujo de LLBLGen, UTILICE.


Escribe tu propio ORM

Puede sonar loco, pero puedes escribir tu propio ORM. En algún momento, en un proyecto, el cliente no quería utilizar bibliotecas o herramientas de terceros y, por ese motivo, terminamos escribiendo nuestro propio ORM que nos sirvió objetivos específicos. Puede decorar las clases y propiedades de sus objetos con atributos para mapearlos con tablas y campos de base de datos. Tener una clase base para todos los objetos de negocios y realizar operaciones de base de datos en los objetos utilizando la reflexión

De esta manera, usted puede construir su propio ORM pequeño para adaptarse a los objetivos particulares que desea. Para su referencia, puede parecer algo así.

[TableMapping("Users", "User", "Users")] public class User : EntityBase { #region Constructor(s) public User() { } #endregion #region Properties #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute private System.Int32 _UserId; private System.String _UserName; [DataFieldMapping("UserID")] [DataObjectFieldAttribute(true, true, false)] [NotNullOrEmpty(Message = "UserID Is Required.")] public override int Id { get { return _UserId; } set { _UserId = value; } } [DataFieldMapping("UserName")] [NotNullOrEmpty(Message = "Username Is Required.")] public string UserName { get { return _UserName; } set { _UserName = value; } } #endregion #region One-To-Many Mappings #endregion #region Derived Properties #endregion #endregion }