Mapeo de una Base de Datos para ASP.NET

Estaba trabajando con ASP.NET con una base de datos en mysql, puede funcionar para otros SGBD solo cambien el driver, y para ahorrar un poco de tiempo se me ocurrió buscar una manera de mapeo, pero no encontré alguna que me convenciera así que intente hacerlo por mi parte, así que les muestro mi solución y espero opinen para algunas mejorar que puedan hacerse.

primeramente una construí una clase que permite el mapeo
using System;
using MySql.Data.MySqlClient;
using System.Collections.Generic;

namespace Mapper
{
 public abstract class MapperDataBase
 {
  MySqlCommand comando;
  MySqlDataReader mysql;
  public MapperDataBase ()
  {
  }

  public void StartQuery (MySqlCommand cmd)
  {
   comando = cmd;
   cmd.Connection.Close ();
   cmd.Connection.Open ();
   mysql = cmd.ExecuteReader ();
  }

  public bool StartQuery (string query, MySqlConnection conn)
  {
   try {
    comando = new MySqlCommand (query, conn);
    comando.Connection.Close ();
    comando.Connection.Open ();
    mysql = comando.ExecuteReader ();
    return true;
   } catch (Exception e) {
    Console.WriteLine(e.Message+" "+e.StackTrace);
    return false;
   }
  }


  public abstract T MapperRow (MySqlDataReader sdr, int index);

  public List < t > GetList ()
  {
   List lista = new List ();
   int i = 0;
   while (mysql.Read()) {
    lista.Add (MapperRow (mysql, i++));
   }
   comando.Connection.Close ();
   return lista;
  }



  public T GetObject ()
  {
   if (mysql.HasRows) {
    mysql.Read ();
    return MapperRow (mysql, 0);
   }
   comando.Connection.Close ();
   return default(T);
  }
 }
}


¿Como se usa?

Creamos primero la clase, el modelo con la que vamos a mapear, en este caso puse usuarios.

public class UserModel
 {

              [StringLength(16)]
              public string username { get; set; }

               public string pass{ get; set; }

  public string rol{get; set; }

  public string mail{get; set; }
  
  public string phone{get; set; }

  public int id_rol{get; set; }

  public bool status{get; set;}


 }


y extendemos la clase Mapper de la siguiente forma

public class MapperUser : Mapper.MapperDataBase
 {

  public override UserModel MapperRow (MySqlDataReader sdr, int i)
  {
   UserModel user = new UserModel ();
   user.username = sdr.GetString ("username");
   user.phone = sdr.GetString ("phone");
   user.id_rol = sdr.GetInt32 ("id_rol");
   user.mail = sdr.GetString ("mail");
   user.pass = sdr.GetString ("pass");
   user.status = (sdr.GetInt16 ("status") == 1);
   user.rol = sdr.GetString ("role");
   return user;
  }

 }


y cuando queramos usarlo, lo podemos llamar de la siguiente forma:

   MySqlConnection conn = new MySqlConnection (ConfigurationManager.ConnectionStrings ["MysqlConnect"].ToString ());
MapperUser mapper = new MapperUser ();
   mapper.StartQuery ("Select * from user", conn);
                        mapper.GetList (); // retorna una lista con todos los usuarios

Asi solo programamos una vez, usamos muchas veces :).

Comentarios

Entradas más populares de este blog

Instalación de PROXMOX (por usb)

Firmar y publicar una app de Cordova en Play Store

Método PERT.