Configurando MySQL en .NET

MySQL constituye una base de datos muy versátil para cierto tipo de aplicaciones, gratuita y con un gran número de opciones se ha convertido en un standard para aplicaciones de tamaño medio aunque también sea válida para aplicaciones de gran tamaño.

A pesar de que generalmente se asocia con aplicaciones de código libre y con otros lenguajes de programación actualmente también tiene desarrollado un conector para .NET que soporta Entity Framework 6.

En este caso vamos a ver su configuración para Code First en .NET 4.5.1, el proyecto de ejemplo será una aplicación MVC usando Visual Studio 2013 aunque cualquier tipo de proyecto es válido.

Lo primero es instalar el conector, se puede descargar directamente o usando NuGet, en este caso usaremos NuGet por ser el sistema más habitual  actualmente.

Hay que instalar dos paquetes:

  • Entity Framework 6.1.3
  • MySql.Data.Entity 6.9.8 (que instalará MySql.Data 6.9.8)

Una vez hecho esto agregamos en web.config la configuración de EF, algunas de estas secciones nos las incluirá el propio paquete NuGet, todas se incluyen dentro del raíz de configuración (nodo “configuration”)

Primero la sección de configuración,

<configSections>
  <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

La sección propiamente dicha,

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="v12.0" />
    </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider>
    </providers>
</entityFramework>

El proveedor de datos,

<system.data>
  <DbProviderFactories>
    <remove invariant="MySql.Data.MySqlClient" />
    <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  </DbProviderFactories>
</system.data>

Y la cadena de conexión,

<connectionStrings>
  <add name="MyContext" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=DB;uid=user;password=password" />
</connectionStrings>

Después tenemos que indicar la clase DbConfiguration que usaremos, para esto hay varias opciones:

  • Se puede incluir en la sección de configuración de web.config a través de:
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

o en una clase que inicialice la aplicación a través de la sentencia:

DbConfiguration.SetConfiguration(new MySqlEFConfiguration());

Otra opción es como un atributo en la clase del contexto, este es el método que usaremos ya que dependiendo del tipo de proyecto (MVC en este caso) puede no ser posible por la forma en la que se inicializa la aplicación (si estamos usamos por ejemplo un atributo de inicialización) ya que nos dará un error indicando que la configuración por defecto ya ha sido cargada.

namespace XXX.Models
{
    [DbConfigurationType(typeof(MySqlEFConfiguration))]
    public class MyContext : DbContext
    {
        public PorraContext() : base("MyContext")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
}

Una vez hecho habilitamos las migraciones con el comando:

Enable-Migrations

En la clase Configuration que nos habrá creado incluiremos las siguientes dos líneas la primera nos generará el código MySQL correcto (sino al crear una migración nos dará error) y la segunda línea servirá para que nos generé la tabla _MigrationHistory correctamente (sino nos dará un error de longitud de clave).

    internal sealed class Configuration : DbMigrationsConfiguration<XXX.Models.PorraContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
            SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); //here s the thing.
        }
        protected override void Seed(Porra.Models.MyContext context)        {        }
    }

Después de hacer esto ya podremos incluir y lanzar migraciones sin problemas, con los comandos.

Add-Migration XXX_1.0

Update-Database – Verbose

Configurando MySQL en .NET

Una tecnología para dominarlos a todos…

Pues no, no la hay, antes solo existía el debate de Windows vs Linux, luego se sumo Intel vs AMD, ahora ya tenemos un poco de todo Java vs .NET, PHP vs Ruby… –¿dónde quedo ensamblador contra C?-.
Ahora evolucionamos al mundo framework, en JavaScript un festival, React vs Angular vs Aurelia vs Boostrap vs …. pero tampoco pasa nada porque en el fondo unos se pueden mezclar con otros, si al final hasta se quieren llevar bien.
Por otro lado tenemos los lenguajes de nueva hornada en general surgidos de la nueva ola funcional, desde Scala a F# a Clojure, para todos aquellos que os habéis preguntado si hay vida más allá del imperativo, pues si, la hay.
NoSQL viene a romper el inmovilista mercado de las bases de datos, más de un dba debería preocuparse, por mi perfecto, por fin alguien se molesta en hacer bases de datos para desarrolladores y si yo quiero guardar un objeto lo guardo y no tengo que partirlo en trozos para luego volver a juntarlos.
Breve recorrido por el mundo arquitectura, desde los grandes clásicos de 3 capas a N capas, pasando por DDD, EDA, aspectos… como no permitiendo combinaciones entre ellos no vaya a ser que alguien se quede atrás y decir que si solo haces 3 capas es de pobres y DDD es de innovadores que matan moscas a cañonazos cuando realmente deberías estar haciendo SOA que sirve para todo, lo de ahora y lo que vendrá.
Como no podía ser de otra manera tocan las metodologías, TDD, BDD, por supuesto TDD es lo que te hará tener una aplicación con menos errores que una hoja en blanco y BDD hará que quieres irte de cañas con los funcionales de tus proyectos, cuando llegues a las copas estarás hablando de ATDD.
Parece muchas veces que haya que tomar partido, no existe esa necesidad, los extremos en informática no funcionan, ni desde el lado propietario cerrando puertas al campo ni desde el código libre teniendo tal diversidad de distribuciones y software repetido que la fuerza se dispersa.
La virtud está en el término medio, es bueno que haya código libre pero tiene que haber una base a la que agarrarse, con Linux se han intentado crear consorcios con más pena que gloria, en desarrollo a .NET se le supuso una teórica capacidad multiplataforma (sin contar Core) que nunca llego y al final Java siempre termina ejecutándose en entornos Unix.
Las pruebas unitarias son útiles y necesarias pero no un pilar que te condicione un desarrollo como en TDD, BDD no te va dar fiabilidad integral a tu aplicación pero cada uno en su lado (¿Back y Front?, ¿microservicios y SPA?, ¿entorno técnico y funcional?) suponen una buena combinación.
DDD te puede dar escalabilidad y la transversalidad se la puedes dejar a AOP, si has perdido la pista de tú código EDA te puede poner en la senda y si el frontal es ligero un n-capas estilo MVC te responderá bien.
No entrare en el oscuro mundo de la arquitectura corporativa o como coger tu aplicación partirla en trozos y lanzar cada uno por separado a través de buses de conectividad proporcionando todo tipo de servicios, al menos se puede decir que en este ámbito existe más combinación.
Los frameworks estan de moda en líneas generales, son útiles siempre y cuando el framework no tape el lenguaje, –se jQuery pero no se que es JavaScript-, siempre he creído que un framework es bueno cuando inviertes más tiempo en leerlo que en escribir código.
Politizar la informática haciendo bandera de «¿ves como te decía que la tecnología Pokemon iba a triunfar?» quizás no sea la opción, habría que optar más por formas de arreglar problemas que por intentar encontrar el santo grial que nos permita no tener que volver a leer un manual de informática, yo por lo menos sabía lo que me esperaba cuando me metí en esto (bueno, quizás no tanto).

Una tecnología para dominarlos a todos…

Los medios de comunicación

Dentro de los medios de comunicación se podría citar:

Para huir de la polémica de quien inventó la radio digamos que se inventó allá por 1890, a día de hoy sigue vigente lo cual le da más de un siglo de vida, es cierto que no tiene tanta audiencia como la que podía tener en un principio pero no se puede negar que sigue estando presente a pesar de que posiblemente no vaya a salir nada más revolucionario como la guerra de los mundos de Orson Welles, es un sistema unidireccional que solo transmite sonido.

La televisión llega alrededor de 1920, ahora tenemos un sistema unidireccional que emite imagen y sonido, mucho más versátil ya que capta más sentidos por lo que puede producir más efecto en el espectador a la vez que es un sistema que proporciona más posibilidades, de hecho a día de hoy siguen saliendo nuevos formatos de programa aunque es cierto que ya se le atisban ciertos síntomas de agotamiento.

Llega Internet, originalmente una BBS estático y unidireccional, y en poco menos de 30 años ha superado a todos los sistemas anteriores, transmite imagen y sonido, es dinámico y lo más importante, es bidireccional, se puede interactuar con el otro.

Al igual que los primeros programas de radio y televisión vistos a día de hoy pueden parecer simples y sin mucho sentido, en Internet sucede lo mismo, es posible que dentro de algunos años mirar hacia atrás y ver páginas donde solo podías escribir 140 caracteres y los mensajes se agolpan unos detrás de otros haga pensar que sentido tenía hacer eso, al igual que por ejemplo haya que rellenar cientos de formularios para darse de alta sin que la propia aplicación reconozca a la persona que entra.

Internet crece en varias direcciones, el propio dispositivo varía, antes solo un ordenador permitía el acceso, ahora es raro el dispositivo que no tiene una conexión de red, nos encontramos en la prehistoria de Internet y de las conexiones, es complicado vaticinar en qué dirección o cuáles serán las próximas aplicaciones que realmente explotarán este potencial, sí que es cierto que en gran parte modifica el comportamiento social y todo lo que conlleva, es posible que Internet haya sido la mayor revolución social que se haya producido y motivado todo esto por una invención tecnológica, más allá de convicciones o de política.

Internet como medio de comunicación se convierte en un nicho inabarcable de posibilidades por explotar, no solo eso sino la posibilidad de interactuar con él, de modificarlo o de dejar la huella de cada uno impresa en una web, antes una de las cosas que había que hacer en la vida era plantar un árbol, quizás ahora haya que añadir que también sea tener una web.

Si la radio o la televisión siguen vigentes con un siglo de experiencia, ¿Cuánto más podrá estar Internet? Incluso se podría pensar… ¿habrá algo más después?

Los medios de comunicación

El informático usuario

A raíz de la mejora de la tecnología es inevitable que surjan nuevas especializaciones, por ejemplo usabilidad, o dicho de otra forma la capacidad de que usuarios cada vez más inexpertos sean capaces de usar algo con la misma habilidad que alguien con más capacidades.

La mejora de la informática ha abierto las puertas a nuevos tipos de clientes menos habilidosos con las tecnologías, alejados de aquellos otros usuarios que eran expertos en comandos de consola, también por extensión ha provocado que el usuario sea cada vez menos capaz de resolver problemas por sí mismo lo cual ha llenado la red de comentarios irónicos sobre preguntas realizadas al SAT.

Parece evidente que las nuevas tecnologías son para facilitar la vida al usuario -aunque algunos de estos todavía no se lo crean-, pero habría que mirar también si el informático se está convirtiendo en un usuario de sí mismo.

No vamos a comparar programar en un lenguaje como Java con hacerlo en ensamblador, cada vez es más fácil realizar aplicaciones y dentro de algún tiempo es posible que hasta un usuario sea capaz de realizar aplicaciones -¿fue VB 6 un intento de esto? Siempre me quedará la duda– aunque también se podría decir que existen excepciones como C++ que son el caso contrario.

Existen infinidad de lenguajes fáciles y rápidos de aprender, posiblemente ahora mismo se tarda menos de una semana en escribir una aplicación normal en cualquier lenguaje con menos de 10 años de vida, y si el lenguaje es un poco complicado siempre tendrás un framework a mano que te simplifique la generación de código.

El perfil de informático se divide, entre el que realiza APIs complejas, lenguajes nuevos, frameworks, diseña y crea, y el que usa estas tecnologías, aprende un lenguaje o a usar un framework y realiza la aplicación que se le solicite, este último realmente es posible que se dedique a reutilizar ejemplos sacados de foros y documentación e insertarlos en aplicaciones, al final se convierte en un integrador de código.

Es posible que este sea uno de los perfiles más habituales y que suelen interesar bastante, se realizan aplicaciones de manera rápida –algo que siempre interesa, sobre todo por esa enfermedad llamada beneficio a corto plazo– y se lanzan a producción como si fueran platos precocinados, con suerte –por decir algo- es posible que exista un arquitecto que posiblemente solo será capaz de echar sal antes de que tenga que meterlo al microondas.

En otro caso simplemente se realiza un trabajo plano que saca un resultado, el informático se convierte en usuario de sí mismo, cualquier imprevisto o requisito sacado fuera de ese trabajo plano no se podrá resolver porque nunca ha tenido esa necesidad, se verá obligado a consultar a otros por algo que en teoría se le supone capaz de hacer.

No es malo usar código ya existente pero tiene que servir para algo más, para entender los conceptos y extraerlos, al final se reduce a lo uso o lo entiendo.

El informático usuario

La especialización

A medida que han ido surgiendo nuevas tecnologías cada vez se ha ido tendiendo más hacia la especialización, esto conlleva una ventaja evidente dado que es más fácil explotar dicha tecnología.

Sin embargo también es verdad que cada vez se solicitan perfiles más amplios, esto se ha visto recientemente con los devops donde encajan varias disciplinas, tanto a nivel de sistemas como de desarrollo.

También es interesante que en una carrera de informática se den varias disciplinas, tecnología, redes, programación… Debido esto a que no se sabe cuál será el destino laboral final, y si por otro lado se requiere algún tipo de especialización concreta se puede optar por algún curso o máster.

Constantemente surgen cambios, ya sea por nuevos diseños, lenguajes y plataformas, porque los actuales sufren algún cambio de versión o porque desaparecen al no tener el suficiente respaldo de la comunidad, esto plantea también otros problemas al informático, por ejemplo acertar con la tecnología correcta.

Cada vez más la ventaja de tener un perfil muy especializado se va difuminando, no tener constancia de otras tecnologías condena a vivir en una isla tecnológica sin conocimiento del mundo exterior, SCRUM por ejemplo alienta a los equipos multidisciplinares.

¿Hasta qué punto compensa la especialización? ¿Cuanto tiempo hay que estar en una tecnología para que resulte rentable?, antes de que esta cambie, desaparezca o surja una nueva mejor que la absorba.

¿No resultaría mejor opción tener un perfil de aprendizaje rápido? que permita rápidamente reconocer, integrar y explotar nuevas tecnologías, esto por ejemplo en programación resulta  similar a los lenguajes naturales, los primeros son difíciles pero a partir de ahí por reconocimiento de patrones resulta más fácil aprender otros.

Se puede argumentar que es complicado explotar así una tecnología pero realmente puede ser al revés, conocer unas te lleva a buscar estructuras parecidas o similares en otras averiguando las posibilidades que ofrecen, en este caso la cuestión estaría en conocer un ejemplo clave de una tecnología enmarcada dentro de un área concreta, por ejemplo un lenguaje como C# o Java para programación orientada a objetos o una distribución de Linux para sistemas Unix/Linux.

Este conocimiento más variado permite elegir en un momento dado cual será el área a aplicar a un problema así como dentro de esa área cual puede ser la tecnología más adecuada, un amplio conocimiento de las tecnologías existentes aunque no se tenga una especialización resulta más útil de cara a poder elegir o descartar más allá de interés particulares.

Posiblemente el mayor problema radica en encontrar ese perfil más que en encontrar uno que tenga una lista interminable de siglas tecnológicas en su currículum.

La especialización