Recomendación .NET C# y ORM

Hola, ¿Cómo están?…Espero que bien.

Bueno, como muchos ya sabrán -por trabajo- desgraciadamente en ciertos proyectos es necesario utilizar la INÚTIL gran plataforma que Microsoft nos ofrece, llamada: .NET Framework.

Sin embargo yo que vengo del mundo Java en donde todo es bello y encuentras frameworks para trabajar de la manera más cómoda posible para el desarrollador. Me encontré con algo maravilloso para Java que se llama Hibernate, francamente está bien, el único problema es que debes hacer los xml de mapping y de configuración de Hibernate, algo que no es difícil pero si muy tedioso y se pierde mucho tiempo haciéndolo a mano. Después encontré un par de aplicaciones que te ayudan a realizar esa labor por tí.

Después de estar acostumbrado a las maravillas de Hibernate, conocí algo aún más maravilloso llamado Play!, que es un framework para el desarrollo de aplicaciones web. Lo que pasa es que Play! integra una API propia combinada de Hibernate y JPA; y su gran ventaja es que esos raros y engorrosos xml de configuración y mapping de Hibernate ¡SIMPLEMENTE NO SON NECESARIOS!. Basta con hacer algo como esto:

package Models;
/*Esto representa a la tabla persona en la db*/
/*Se importan las librerías de play que permiten dicha maravilla*/

@Entity
public class Persona extends Model{
/*Todos los atributos de esta clase
sin incluir el id*/
}

package Controllers;
/*Esta clase maneja a las personas de la db*/
import Models.Persona;
/*Se importan las librerías de play.*/
public class Personas extends Controller{
/*El sencillo y simple método hace un insert a la db a la
tabla persona*/
—-public static void GuardarPersona(String name){
——–Persona p = new Persona();
——–p.Nombre = name;
——–p.Save();
—-}
}

¿Cierto o falso qué es una maravilla?…Pues bien quería encontrar algo similar en .NET en específico C# (ya que C# se basó en Java) …Todo lo que encontré o era de paga o estaba en fase ALPHA ó BETA. Resulta que según Microsoft como son “los todopoderosos” ofrecen algo incluido en su IDE llamado LINQ, si muy bonito y todo, pero resulta que solo funciona con MS SQL Server. De modo que si estás usando MySQL, PostgreSQL, SQLite, Oracle o cualquier otro motor de base de datos simplemente LINQ no es para tí.

Es cierto que existen forks tratando de igualar lo que LINQ hace, pero como dije o son de paga o están en fase BETA O ALPHA haciendolos poco fiables para una aplicación seria. Sin embargo recordé que hay un “hermano” de Hibernate para la plataforma .NET llamado NHibernate; para luego lo descargué lo agregué como referencia….Para mi suerte al hacer los ficheros de configuración y mapeo de NHibernate, Visual Studio 2008 no los encuentra y he visto muchas quejas similares.

Y de modo que mis alternativas se cerraban, ya que no contaba con $200 USD para comprarme la licencia de un ORM para .NET muy bueno que trabaja con ActiveRecord (si eres rubialero y necesitas hacer algo en .NET, http://subsonicproject.com/ <- Eso es la forma de hacerlo).

Así que desilusionado y desesperado estaba haciendo todo con SQL al "old fashioned way"…pero se me ocurrió una manera de hacerlo al estilo ORM:

1.- Definir modelos: Si asi de sencillo, llegas a tu proyecto y creas un paquete llamado modelos. En donde por ejemplo haces una clase Persona, con sus atributos (publicos si te quieres evitar la molestia de teclear “public String Nombre { get{return nombre;} set{nombre=value;} }”, aunque es tu voluntad hacerlo. Yo por ahorrar tiempo en debugg ;). Es recomendable agregar las funciones “FinById”, “Save”, “Update”, “Delete”, “ListAll”; en las cuales utilizamos sentencias “SQL a pelo”. Para que fuera de esta clase dejes de ver cosas como: “SELECT * FROM persona WHERE id=?id” y solo lo veas en tu clase.

Desde donde estamos parados, lo mas complicado son los “SELECT”, en donde podemos hacer lo siguiente:

DataTable miTabla = new DataTable();
con.open();
new MySqlDataAdapter(query, con).Fill(miTabla); /*Donde query es un String y con una conexion de MySql*/

Ahora, dependiendo de como lo vayamos a utilizar lo “mapeamos” a un objeto tipo Persona o lo mostramos en una estructura como un DataGridView…

/*Mostrarlo en un DataGridView*/
dgvPersonas.DataSource = Persona.ListAll();

/*Mapeandolo a objeto, cuando se utiliza FindById y dentro de FindById*/
Persona p = new Persona();
p.Id = miTabla.Rows[0][“id”].Value.ToString(); /*La variable “miTabla” no es la misma de el ejemplo anterior. Para llenar las otras propiedades solo se cambiar la propiedad a la que se va a modificar el valor y la columna en la tabla que va a asignar ese valor.*/

2.-Definir el controlador: La ventaja de utilizar MS Visual Studio con .NET 2.0 o posterior es que la Vista (Form o WebPage) es que esta ligada de manera nativa. Por lo que puedes capturar eventos que llamen a las funciones de tu modelo.

void BtnGuardar_Click(object sender, EventArgs e) {
/*—-*/Persona p = new Persona();
/*—-*/p.Nombre = txtNombre.Text;
/*Lo repetimos con cada una de las propiedades*/
/*—-*/p.Save();
}

Es una cosa magnifica usar ORM, ya que te olvidas de cosas raras como los JOINS, subconsultas de subconsultas de una consulta que es una vista en una subconsulta (justo lo que veo hoy en Bases de datos), entre otras amargas cosas que puede provocar el “SQL a pelo”.

Igual, es solo una sugerencia para aquellos que quieren facilitarse la vida al momento de mostrar lo que hay en una tabla o al momento de desarrollar para hacerlo de manera mas simple. Y sin repeticiones a lo que llamamos DRY (Don’t Repear Yourself => click, algo de lo que hablaremos en otro momento.

Saludos y gracias por sus visitas. Comentarios aceptados.

Anuncios

10 comentarios en “Recomendación .NET C# y ORM

  1. Cierto, lamentablemente no se encuentra alguna libreria ORM open-source para C#

    Nunca he programado en java solo en .NET, php, mysql, C/C++

    Y estaba pensando en crearme un ORM estilo Doctrine que esta hecho en php:

    Un ejemplo:

    $q = Doctrine_Query::create()
    ->from(‘User u’)
    ->leftJoin(‘u.Phonenumbers p’);

    $result = $q->fecthArray();

    Y hacerlo en C#:

    var q = Doctrine_Query.create()
    .from(‘User u’)
    .leftJoin(‘u.Phonenumbers p’);

    var result = $q->fecthArray();

    Empezaria con lo mas basico para no atorarme, a ver si me animo… ya que como ya comentastes no hay nada bueno en la web

    Saludos

    1. ummestesimon dijo:

      No con afán de atacar, pero, creo que sería mejor que desarrollaras un DSL sobre C# para conseguir lo que buscas. Porqué una librería como Doctrine en cuanto a desempeño no es tan óptima.

  2. Una pena que no entiendas que LINQ es una extension para la manipulacion de objetos no un orn, y que funciona muy bien en un orm, pero ante gente cerrada pocas ideas llegan

    1. ummestesimon dijo:

      Gracias por la visita, te enumeraré las razones de ésta entrada:

      1) Es una entrada de 2010
      2) Usando .Net 3.0 y 2.0
      3) LINQ en ese momento no tenía soporte nativo para MySQL, de hecho funcionaba únicamente con MS SQL SERVER.
      4) El nuevo LINQ disponible desde .NET 4 ya cambia mucho la cosa.

      Así que no era que no comprendiera si no que dado mi stack de tecnologías, no era factible pasarse a Linq en ese momento.

      Saludos

    1. Sir Noth dijo:

      A ver… LINQ, allá por el 2010, si que era muy diferente de cómo es ahora, ya que antes no te daba la posibilidad (que ahora brinda) de hacer consultas a un arreglo. Vamos, en aquellos ayeres (cuando hice esta entrada) se empezaba a hacer uso de LINQ, que para .NET 3.5 ya se había extendido su uso y potencial, haciendo que básicamente en cualquier estructura con nodos se pudiera hacer una búsqueda, haciendo de (P)LINQ una verdadera gozada.

      Repito, la fecha de la entrada es 2010. Si no me crees que no era posible usar Linq con MySQL no entiendo porqué entonces hubo compañías que ofrecían por medio de librerías la posibilidad de utilizar “dialectos” similares a LINQ. Y mucho menos entiendo, para qué lo hacían y más cuando casi TODAS esas librerías eran de pago.

      Si comparamos (P)LINQ, el que se incluye a partir de .NET 3.5 (si mal no recuerdo) con el Linq que yo quería usar (de nuevo y para que quede claro, allá por el 2010), la diferencia es completamente abismal.

      Y por cierto, no es de objetos es de programación híbrida (objetos/funcional/imperativa).

  3. alguien dijo:

    Tanto enredo para lo que terminaste haciendo. Existen muchas variantes para construir capas de datos en .NET lo que pasa es que tu no desarrollas en esta tecnología por eso no las conoces y yo no te las voy a decir xq me cagan los javeros XD….

    1. Sir Noth dijo:

      ¿Enredo?.

      Bueno basta ver la lucidez de quien comenta dando joyas como:

      .NET lo que pasa es que tu no desarrollas en esta tecnología por eso no las conoces

      Tal parece que alguien se ha enfocado más en una tecnología y
      menos en algo llamado: “Programación de propósito general”, por
      tanto lo que hice (según tú, que eres un conocedor de las variantes
      para construir capas de datos) es una aproximación del patrón de
      diseño DAO.

      Ahora, desarrollar o no en una tecnología no te hace saber menos
      o más. Y me he topado mucho (con gente de .NET en especial) que
      dicen: “Es que tú no eres experto .NET así que no comprendes C#/F#”,
      pero se me hace muy curioso que generalmente si alguien que viene
      por ejemplo de Java lo sientan frente a Visual Studio entiende la
      estructura, determina los patrones de diseño utilizados, se aprende
      las convenciones del lenguaje y de paso, es capaz de hacer algunas
      modificaciones. En cambio a la gente que es experta en alguna tecnología
      de Microsoft les mueven su entorno y se desorientan. Y lo digo que
      me han pedido hacerla de reclutador, por lo general la gente que
      usa tecnologías Microsoft se siente incómodo fuera de ellas y muchas
      veces no saben ni que es Factory, MVC, Singleton, etc. Mientras
      que la gente que usa otras tecnologías, generalmente comprende dichos
      conceptos y simplemente trabajan en la plataforma que les digas.

      Ahora, como vengo repitiendo a cada comentario, esta es una entrada
      de 2010, venía haciendo el mantenimiento a una aplicación que usaba
      .NET 2.0 y otra con .NET 3.0, tiempo en el que LINQ estaba “verde”,
      y funcionaba únicamente para MS SQL Server, de lo contrario, no entiendo
      porqué había compañías que te vendían el plug-in/librería para poder
      usar LINQ en ve tú a saber que base de datos y además eran de paga.

      En fin, como dije, eso fue hace tiempo, a día de hoy (P)LINQ es una
      opción más que genial para hacer las búsquedas en cualquier estructura
      de datos en base de árboles o grafos (arreglos y listas, por mencionar
      algunos).

      Gracias por la visita.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s