c# .net orm subsonic

c# - Experiencia subsónica de ORM



.net subsonic (3)

Hace algún tiempo, estaba buscando un ORM simple para una pequeña aplicación y SubSonic era justo lo que necesitaba. La configuración es fácil y no necesito mucho tiempo para agregar algo de persistencia a mis clases de dominio. Lo que me gustó al respecto fue la opción de automatizar el modelo de base de datos en función de las clases de dominio.

La desventaja de esto es que el conjunto de características es bastante limitado. Las cosas que más me perdí fue la opción de buscar gráficos de objetos completos y el apoyo de índices adicionales. SubSonic tiene su uso como una herramienta de persistencia para aplicaciones pequeñas, pero para aplicaciones importantes o grandes preferiría usar nHibernate o un ORM comercial como LLBLGen.

Antes de elegir un ORM, debe decidir sobre los requisitos básicos de acceso a datos. ¿Desea utilizar el patrón de registro activo o el patrón de adaptador? ¿Qué pasa con la concurrencia, el rendimiento, la herencia, etc.?

Estoy buscando un nuevo ORM para un proyecto importante, estoy acostumbrado a nHibernate con ActiveRecord y ya tengo una muy mala experiencia con EF4, rendimiento y bloqueo de GUI.

Así que buscar en la web Encontré el subsónico, me gustó lo que leí en la documentación.

Entonces, me gustaría saber si alguien ya usó el subsónico y si la experiencia fue buena.


Usé Supersonic, es bueno siempre que uses consultas simples. Cuando comencé a tener consultas más complejas, vi que carece de características LINQ. Después de buscar en Google un poco cambié a http://bltoolkit.net , y desde ese momento (hace unos 2 años) estoy muy contento con él. Además, es uno de los ORM más rápidos según http://ormeter.net/ . Échale un vistazo, no lo lamentarás.


Hmm ... bueno ... ¿cómo debería decirlo ...

Actualmente estoy (como en este momento) dedicando esfuerzos para reemplazar SubSonic con PetaPoco . Supongo que eso dice algo.

No es que SubSonic fuera malo exactamente, pero no encajaba en mi forma de desarrollarme muy bien. Y para las personas que buscan adoptarlo en este punto, parece muy importante notar la absoluta falta de actividad en el proyecto.

Primero, la razón principal por la que SubSonic no me quedaba era LINQ.

Hay encanto en tener la verificación del compilador de todo el uso de la propiedad, para estar seguro. Sin embargo, en la práctica, simplemente no era adecuado para consultas.

Si te apegas mucho al uso de class-per-table y ActiveRecord, supongo que está bien. Pero cada vez que teníamos que hacer una consulta más allá de eso (cualquier cosa que implique varias tablas o algo más allá de las cláusulas where más simples), era una pesadilla. Las asociaciones no se pueden usar directamente en una consulta SubSonic LINQ, como lo hacen en EF o nHibernate, que probablemente fue el punto de mayor dolor.

Por ejemplo, una consulta como esta no funcionará en SubSonic, pero sí en EF:

db.Accounts.Where(a => a.OwningUser.Email != null);

Donde terminé fue haciendo muchos viajes redondos a la base de datos para armar un resultado, o usando la clase CodingHorror de CodingHorror para consultar directamente con SQL, y no pudiendo simplemente materializarlos como POCO (una vez más, al ir más allá de la simple clase-per- mesa).

También encontré que cada proveedor de LINQ admite diferentes conjuntos de operaciones y, a veces, la misma operación lógica tendrá una sintaxis y un uso ligeramente diferentes entre los proveedores. Esto hizo que escribir la mayoría de las consultas llevara mucho tiempo y fuera propenso a errores. El proveedor de LINQ de SubSonic no está exento de peculiaridades y pocas funciones. No se acerca mucho a Linq-2-SQL, Entity Framework o LINQ para nHibernar los términos de operaciones admitidas, usabilidad o velocidad de ejecución (prepárese para aprender nuevas formas de escribir combinaciones en LINQ solo para SubSonic - y estar preparado para tener algunas operaciones comunes simplemente no será posible con el proveedor LINQ de SubSonic, a pesar de ser errores conocidos durante un año ).

Además de la resistencia a la productividad, es fácil olvidar que el código LINQ que está escribiendo es muy específico del proveedor. ANSI SQL es mucho más estándar y compatible con cross-line que LINQ.

LINQ también me sedujo con la posibilidad de reutilizar el código con técnicas como Especificaciones, pero darles vida no era nada fácil, y el resultado final no valía la pena. Los obstáculos que encontré aquí se debieron en gran parte al hecho de que el proveedor LINQ de SubSonic no tenía soporte para las asociaciones.

Las instalaciones de SubSonic fuera de LINQ me parecieron mediocres en el mejor de los casos (en mi opinión).

En segundo lugar, es importante saber que, según todas las medidas, SubSonic no es un proyecto activo.

El creador inicial de SubSonic, Rob Conery, ya no trabaja en el proyecto. El último compromiso que Rob hizo fue en julio de 2010 .

El último compromiso con el proyecto fue hace 3 meses , a pesar de casi 100 problemas pendientes . Y hasta donde puedo decir, no ha habido ningún lanzamiento, ni siquiera un lanzamiento de punto menor, ya que Rob dejó de trabajar en SubSonic (aunque la gente que todavía ronda el proyecto ha estado hablando de un lanzamiento durante más de medio año ) .

El Grupo de Google para SubSonic solía estar activo, pero en estos días no tanto. Y también el sitio web oficial para el proyecto SubSonic ha sido Yellow-Screen-of-Death por un tiempo (el sitio ya no tiene pantallas amarillas).

El nuevo picor en el acceso a datos es micro-ORM. El creador de SubSonic, en realidad, dio una patada a esta tendencia con Massive , seguido poco después por el equipo de StackExchange que lanzó Dapper , y más tarde salió PetaPoco . Hay un par más, también. Y a la vez que renunciamos a un pequeño compilador comprobando con fragmentos de SQL en nuestra base de códigos, me parece que el micro-ORM se ajusta mucho mejor a mi estilo de desarrollo que SubSonic.

Mi experiencia (aunque limitada) con nHibernate fue que es demasiado complicada para la mayoría de los escenarios, e incluso cuando es apropiado, asesinó absolutamente los tiempos de inicio de mi aplicación. También hubo una gran curva de aprendizaje (que puede haber pasado), pero también hay varias maneras de hacerlo ... básicamente todo ... así que simplemente agrega muchas más decisiones a mi proceso (me ralentiza).

Con PetaPoco, puedo escribir un SQL familiar (soy rápido y razonablemente bueno con eso) y materializarlos en POCO, que sé qué diablos hacer inmediatamente. Una pequeña cantidad de arquitectura y organización y pruebas de integración automatizadas, y no me siento del todo sucio con la incrustación de bits de SQL.

Ah, y supongo que lo último - SubSonic está lejos de ser la forma más rápida de obtener datos. Puede que no sea importante, pero resultó ser para nosotros.

En conclusión (lo siento por el muro de texto):

No es que SubSonic sea malo en ningún sentido absoluto. Simplemente no parecía encajar en la forma en que traté de usarlo en absoluto, y una gran parte de eso es porque LINQ sigue siendo una abstracción con goteras, y tiene goteras de formas diferentes a las que estoy acostumbrado.

El hecho de que los esfuerzos de desarrollo son casi inexistentes es bueno y malo. Bueno, es estable y se considera "terminado" en cierto sentido. Malo, carece de características, posiblemente tiene algunos errores, y no es el de mejor rendimiento, y no hay nadie trabajando para mejorar eso.