8

Últimamente he estado investigando los ORM basados ​​en .NET que están disponibles. Me di cuenta de que cada uno termina en uno o dos campamentos. En un campo, la base de datos se crea primero, y el ORM proporciona una manera más fácil de acceder a la base de datos en una aplicación. En el segundo campo, el modelo de objetos existe primero y el ORM facilita la persistencia del modelo de objetos en una base de datos.ORM Comparación: ¿Cuál es la base de datos o las clases primero?

Ahora no estoy preguntando o afirmando si un campamento es mejor que el otro. Ciertamente puedo ver razones para cada metodología de diseño. Lo que me frustra es que de todos los tutoriales y documentos de "inicio" que he leído últimamente, ninguno acaba de aparecer y decir desde el principio "esta herramienta supone que está comenzando con un modelo de base de datos/objeto existente". Para mí, esto es bastante fundamental para saber si usarías un ORM versus otro.

Así que después de hacer un montón de lecturas, y crear un par de proyectos "Hello World", he creado una serie de viñetas sobre los flujos de trabajo compatibles con los ORM que he estudiado. ¿Alguien con experiencia con estas herramientas me puede decir si he hecho declaraciones incorrectas o si me he perdido por completo algún punto realmente importante? Específicamente, me gustaría saber si mis suposiciones sobre si el esquema de la base de datos o el modelo de objetos deberían ser lo primero con cada herramienta son correctos.

Linq To SQL

  • base de datos debe existir primero
  • sólo funciona con SQL Server
  • DataContext clase se utiliza para leer/escribir entre las clases y la base de datos
  • DataContext pueden retun clases físicos reales, o los tipos dinámicos se pueden usar para crear automáticamente tipos basados ​​en el esquema de la base de datos.
  • Asignación por defecto de mapeo nombres de tabla a nombres de clases y nombres de propiedad a los nombres de columna
  • Mapping se puede personalizar mediante atributos incrustados en cada clase

Subsonic (Active Record)

  • base de datos debe ser creado primero
  • Funciona con una serie de tecnologías de base de datos
  • Las clases se generan automáticamente a partir del esquema de base de datos existente utilizando plantillas T4
  • de conexión a la base de datos es totalmente transparente una vez que las clases se generan
    • constructores de clase llamada automagicaly crear registros en la base de datos
    • Cambiando los valores de propiedad actualiza automaticamente la base de datos.

Subsonic (Simple Repository)

  • La estructura de clases debe ser lo primero
  • trabaja con una serie de tecnologías de bases de datos se crea
  • clase repositorio y conectado a una base de datos
  • esquema de base de datos se crea y actualiza automáticamente cuando se agregan clases a el repositorio
    • repo.Add<MyClass>(instance);
    • repositorio utiliza la reflexión para crear/actualizar el esquema de base de datos
    • Crear una tabla para cada tiempo, y una columna para cada propiedad

NHibernate

  • base de datos Uno o estructura de clases se pueden crear primero
    • mapeo puede ser creado para que coincida con una nueva estructura de clases a una base de datos existente
    • Mapping se puede utilizar para automáticamente generate the database schema
  • trabaja con un número de las tecnologías de base de datos
  • Las clases dentro del ensamblaje final se atribuyen a las configuraciones de asignación NHibernate que asignan clases y propiedades a tablas y columnas
  • Hay dos métodos para agregar mapp ing configuración
    • archivos XML Embebido en el binario, <classname>.hbm.xml
    • atributos añadidos al código
  • admite la configuración avanzada de mapas incluyendo uno a uno, uno a mayo, muchos a uno, muchos a muchos, herencia etc..l etc ...
+1

¿Qué hay de ADO.NET Entity Framework? –

+0

Olvidó Entity Framework. Con EF, puede hacer DB primero o primero desarrollo de clase. Usted trabaja con la base de datos a través de EntitySet. También tiene la capacidad de trabajar con múltiples bases de datos usando Entity Framework. –

+0

Simplemente no he tenido tiempo de investigar EF. Por lo que leí, la versión 3.5 de EF no estaba realmente lista. Suena como el 4.La versión 0 tiene mejoras, pero acabo de instalar VS 2010 al final de la semana pasada. Definitivamente me gustaría escuchar cualquier respuesta que compare cómo el flujo de trabajo con EF se compara con los otros ORMS enumerados. –

Respuesta

2

Continuando con los comentarios que hizo subir Entity Framework:

Entity Framework(wikipedia also has some nicely structured information)

  • soporta tanto el código en primer lugar, el modelo de base de datos primero y primer desarrollo. La diferencia entre el código primero y el modelo primero es que en el código primero se escriben las clases de entidad primero, mientras que en el modelo primero se diseña primero el modelo de datos y las entidades se generan en función de él.
  • basado en un modelo de metadatos (EDMX) (aunque es posible que no aparezca en el código) que también define las asignaciones; el EDMX es un modelo XML que contiene la estructura de la base de datos, las estructuras de la entidad y las asignaciones entre ellos y es compatible con un diseñador integrado en Visual Studio.En el código primero, las asignaciones se definen en código en lugar de en EDMX.
  • soporta múltiples tecnologías de bases de datos (he usado MySql y Oracle).
  • basada en la generación T4 código (en v4), que además de permitir para escenarios de extensibilidad interesantes, puede generar:
    • entidades derivadas de una clase base específica para Entity Framework (EntityObject)
    • entidades POCO que don' t depende de Entity Framework en todo
    • entidades de auto-seguimiento.
  • funciona bien con los servicios de RIA (Silverlight).
  • es compatible con casi todos los tipos de relaciones, creo, y la herencia con múltiples estrategias (aunque puede haber algunos problemas con algunos de ellos).
  • muy buen soporte para Linq (Linq para Entidades).

También hay LLBLGen, que no he usado, pero por los comentarios de uno de mis compañeros de trabajo, no es tan bueno.

He usado NHibernate anteriormente, aunque brevemente, y la impresión fue buena; aunque en aquel entonces no era tan maduro como lo es ahora, todavía era una biblioteca muy buena. No estoy seguro si tengo que elegir entre NH y EF ahora ... Creo que iría con EF porque eso es lo que he estado usando durante el último año y el desarrollo sería más rápido (solo para mí), pero la función -wise NH puede estar un poco mejor.

+0

Parece que NH y EF son bastante similares ahora? –

+0

No creo ser el mejor para comentar sobre eso, pero sí, creo que sí. NH puede manejar algunas cosas mejor, como algunos escenarios de herencia de entidades, y tiene más extensiones/complementos, etc. porque es de código abierto. Sin embargo, no sé acerca de otros aspectos de la comparación. –

+1

¿Tus compañeros de trabajo clasificaron a LLBLGen Pro como no tan bueno? ¿Podrías profundizar en eso? –

1

Honestamente, cualquier ORM semi-decente puede manejar primero la base de datos y codificar el primer diseño.

Todos los ORM incluidos en su pregunta (incluidos EF 4 y LLBLGen Pro 3) pueden hacer cualquiera de las dos cosas, pero puede haber diferentes cantidades de dolor. Por ejemplo, primero hacer código para LinqToSql no es realmente lo que se pretendía hacer, pero creo que hay proyectos de código abierto en los que esa función se "atornillaba". Dicho esto, básicamente no hay una buena razón para recomendar LinqToSql dado que Microsoft está empujando a todos hacia Entity Framework en su lugar.

En este momento, NHibernate probablemente tenga la mejor historia en general. Es difícil aventurar una opinión sobre cuál ORM tiene la mejor historia general de la base de datos, dado que todos la apoyan, y ese caso de uso particular no es en realidad en lo que debería basarse su decisión.

Elija un ORM según si es un buen ORM. Los buenos ORM admiten primero tanto la base de datos como el código.

Cuestiones relacionadas