Archivo de la etiqueta: Entity Framework

Timeout en MySQL con Entity Framework

Si se produce un timeout en MySQL con Entity Framework la primera opción que se nos podría ocurrir es agregar el parámetro default command timeout en la cadena de conexión:

<add name="Entities" connectionString="metadata=res://*/DAL.MyModel.csdl|res://*/DAL.MyModel.ssdl|res://*/DAL.MyModel.msl;provider=MySql.Data.MySqlClient;provider connection string='server=localhost;persistsecurityinfo=False;user id=root;password=;database=myddatabase;default command timeout=300'" providerName="System.Data.EntityClient" />

Por desgracia esta solución no funciona debido a un bug en el connector / NET de MySQL. Ver ref. bug.

Por suerte existe una opción para cambiar este valor para el object context en Entity Framework, dependiendo de la versión de Entity Framework:

Entity Framework 6:

this.context.Database.CommandTimeout = 180;

Entity Framework 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4 e inferiores:

this.context.CommandTimeout = 180;

Code First – Resetear Entity Framework Migrations

Si trabajas con Code First, Entity Framework y Migrations es posible que a medida que avanzas en el proyecto llegues a un estado inconsistente de la base de datos cuando intentas actualizarla con el comando update-database.

Lo ideal es solucionarlo con las opciones que te puede ofrecer codefirst, pero si aún así llegas a un punto que creas necesario resetear las migraciones lo que deberás hacer es lo siguiente:

1. – Borrar el directorio Migrations de tu proyecto.
2. – Borrar la tabla _MigrationsHistory de tu base de datos.
3. – Ejecutar el siguiente comando en la consola de administración de paquetes.

Enable-Migrations -EnableAutomaticMigrations -Force

4. – Finalmente ejecutar:

Add-Migration Initial

Todo este proceso hace que se cree un nuevo archivo Initial.cs en la carpeta de Migrations. En él podrás ver (como siempre que realizas una migración) los métodos Up() y Down() que permiten la aplicación de la migración o el regreso al estado anterior.

En este punto antes de utilizar el comando update-database deberás tener en cuenta si quieres borrar la base de datos y partir con la base de datos vacía o aprovechar los datos que ya tenías previamente.

A) Si deseas partir con una base de datos vacía será tan sencillo como borrar todas las tablas de la base de datos y ejecutar update-database.
B) Si quieres aprovechar los datos deberás profundizar en el método Up() de la migración creada y ver que tablas quieres que se regeneren. Previamente a ejecutar update-database deberás borrar las tablas que te interesan resetear en tu base de datos y comentar las líneas de código que crean las tablas que deseas conservar en el método Up(). Una vez realizadas estas dos comprobaciones podrás utilizar el comando update-database.

Espero que este artículo te haya servido de ayuda para Resetear Entity Framework Migrations.

Múltiples columnas de identidad especificadas

Si utilizas programación CodeFirst en tu proyecto .Net es posible que al realizar una modificación en el nombre de la columna que guarda la clave de una tabla/clase/DbSet aparezca el siguiente error al utilizar update-database con alguna migración pendiente.

Multiple identity columns specified for table ‘nombre_tabla’. Only one identity column per table is allowed.

Este error indica que existen múltiples columnas de identidad especificadas, es decir, codefirst entiende que existe más de una columna clave de la tabla.

Para solucionar este problema y hacer que la migración funcione deberás reordenar la lista de operaciones en el script de migración pendiente. Deberás ubicar las operaciones de borrado (drop) primero y luego añadir la columna con la nueva clave.

public partial class RenameKey : DbMigration
{
    public override void Up()
    {
        DropPrimaryKey("dbo.nombre_tabla", new[] { "OldId" });
        DropColumn("dbo.nombre_tabla", "OldId");
        AddColumn("dbo.nombre_tabla", "Id", c => c.Int(nullable: false, identity: true));
        AddPrimaryKey("dbo.GameSummary", "Id");
    }

 

Cadena de conexión MultipleActiveResultSets

El parámetro MultipleActiveResultSets dentro de una cadena de conexión permite mantener conjuntos de resultados múltiples. Si este parámetro se establece en false la aplicación debe procesar o cancelar todos los conjuntos de resultados antes de poder ejecutar cualquier otro dentro de esa conexión.

Un error típico cuando se dehabilita este parámetro es el siguiente:

There is already an open DataReader associated with this Command which must be closed first.

En una cadena de conexión MultipleActiveResultSets es un característica que funciona con sqlserver.

Problema con edmx al publicar en Azure

Espero que no tengas el siguiente problema con edmx al publicar en Azure.

Primero expongo la situación en la que me encontré:

Empecé a desarrollar un proyecto con Visual Studio 2013 en el que partía de una base de datos SQLServer Azure ya creada. Añadí un elemento de edmx para crearme las entidades de la base de datos así como las vistas y procedimientos almacenados.

En mi equipo local conectaba con esta base de datos y el contexto de Entity Framework también funcionaba correctamente ya que conseguí agregar el origen de datos de una tabla a mi GridView.

Pues bien, cuando terminé mi desarrollo y me decidí por publicarlo en Azure al llegar a cualquier pantalla donde necesitaba acceder a los datos me daba el siguiente error:

…SQLException Invalid Object Name «dbo.NombreTabla»…

Lo que aparentemente dice este error es que no existe la tabla en la base de datos a la cual me conectaba. Esto me parecía increíble porque ni siquiera estaba trabajando con la base de datos local sino que en el momento de la programación atacaba directamente a la base de datos en Azure y… funcionaba y seguí funcionando, con lo que la cadena de conexión debería de ser la misma.

Después de darle muchas vueltas observé que aparte de publicar mediante la opción «Web Deploy» existe la opción de publicar mediante «ftp». Decidí publicar en azure mediante ftp y finalmente conseguí que funcionara.

Aún no sé porque el método «Web Deploy» no funcionaba correctamente pero si alguien sabe o intuye por qué por favor que nos lo comente.

 

 

Bases de datos para desplegar con una aplicación .Net

Cómo realizar una instalación de una aplicación nativa en cliente que utilice una base de datos pero sin tener que realizar la instalación completa de sqlserver u oracle por ejemplo que dificultan el despliegue de todo el sistema.

Para solucionar este problema, de momento, he encontrado estas soluciones.

  • Desplegar una base de datos de tipo SQL Server CE (Compact Edition) junto a la aplicación. Cómo desplegar una Base de datos SQL Server Compact con una aplicación.
  • Utilizar SQLite. Es una base de datos que se integra en ficheros casi planos y que es fácil de desplegar con una solución en Visual Studio. Existe una librería en .Net (System.Data.SQLite.dll) que permite acceder. También debe funcionar con Entity Framework pero esto todavía no lo he podido comprobar.
  • Siempre puedes usar un fichero Access para este tipo de despliegues.

 

Modelo y Base de Datos con Identity en ASP NET

Con la versión 4.5 de .NET Framework se ha incorporado la autenticación basada en Identity. Esto ya lo hablamos en pasadas entradas, ahora vamos a verlo un poquito más a fondo.

Con Identity se crean las siguientes tablas:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

En estas tablas se guarda toda la información relacionada con los usuarios. Es en la tabla AspNetUsersr donde  se guardan los siguientes campos:

  • Id
  • UserName
  • PasswordHash
  • SecurityStamp
  • Discriminator

En la siguiente imagen se muestra la estructura de tablas y los campos de la tabla AspNetUsers:

Tablas con Identity en ASP.NET 4.5

Ya entrando en el código, si has generado el proyecto web con una de las plantillas que ofrece Visual Studio 2013 verás que en la carpeta «Models» se ha creado un archivo llamado «IdentityModels.cs». En este fichero existen varias clases que definen la funcionalidad de Identity en la aplicación. Las clases son:

  • ApplicationUser. Es la entidad Usuario de aplicación. Hereda de «IdentityUser» e inicialmente está vacía aunque podemos meterle las propiedades que deseemos para personalizar nuestro modelo de usuario (http://go.microsoft.com/fwlink/?LinkID=317594). Si nos fijamos en la clase de la que hereda contiene las siguientes propiedades que se mapean a la base de datos: Id, PasswordHash, SecurityStamp, UserName así como las colecciones que relacionan con las demás tablas.

Clase IdentityUser

  • ApplicationDbContext. Es la clase que maneja el contexto Entity Framework con la base de datos. De hecho en su constructor coge el connectionstring del web.config para su conexión con la base de datos en este caso «DefaultConnection».

Clase ApplicationDbContext

  • UserManager. Es una clase que gestiona operaciones típicas de usuarios con la base de datos. Hereda de «UserStore» y tiene diversos métodos de creación y borrado de usuarios, adicción y eliminación de roles por usuario, búsqueda por nombre o id y muchos más. También tiene gran parte de estos métodos en su modalidad asíncrona. Sin embargo desde aquí no es posible obtener todos los usuarios.
  • IdentityHelper. Esta clase estática situada fuera del espacio de nombres «Models»se encarga de sincronizar la base de datos en los registros de usuarios con el comportamiento de la aplicación en lo que se refiere a la autenticación. Cada vez que un registro de un usuario se efectúa correctamente pasará por IdentityHelper para insertarlo en la base de datos y posteriormente autenticarlo en la aplicación.

Después de analizar todo este rollo vamos a ver como podríamos obtener todos los usuarios con Identity. Si utilizamos directamente el contexto «ApplicationDbContext» accederemos a todos los usuarios mediante su propiedad «Users»:


IList<ApplicationUser> users = context.Users.ToList();

Key o clave en Entity Framework Code First

Al crear un proyecto con visual studio 2013 que utilice Entity Framework Code First me asaltó la duda de por qué en el modelo no existía en casi ninguna clase la DataAnnotation [Key] que establece que propiedad será la encargada de guardar la clave de la tabla.

Primero hay que indicar que en Entity Framework es absolutamente necesario que cada entidad contenga una clave primaria. En el caso de que no se establezca ninguna clave el generador de la base de datos dará un error en tiempo de ejecución.

Sin embargo si Entity Framework no encuentra la DataAnnotation [Key] irá a buscar una propiedad de la clase que contenga la palabra «Id» (no es case-sensitive) y la asignará automáticamente.


public class Movie
 {

[Required, StringLength(100), Display(Name = "Name")]
 public string MovieName { get; set; }
 public int Id { get; set; }
 }

En el ejemplo anterior a la hora de generar la tabla Movie, Entity Framework entenderá que la propiedad «Id» será la encargada de ser la clave.

Entity Framework Code First

Entre las muchas sorpresas que Microsoft nos viene dando con .NET 4.5 está el progreso que ha hecho la tecnología de Entity Framework esforzándose para que el desarrollador se olvide cada vez más de SQLServer y se pueda centrar en lo que es puramente su trabajo: programar (que no es poco).

Esta última versión (Entity Framework 6) permite utilizar el paradigma de programación Code First (Primero el código). Es cierto que en anteriores versiones se podía utilizar esta técnica pero puedo asegurar que era bastante más complicado que ahora.

¿En qué consiste code first?

Code First te permite primero crear el modelo de datos como clases para posteriormente migrarlo a un sistema de gestión de base de datos. Las clases que se definen para crear el esquema de datos se llaman Entidades o Entity Classes.

Cada propiedad de una clase le corresponde una columna en una tabla equivalente de la base de datos. A estas entidades también se les pueden añadir métodos y funciones.

Últimas tecnologías Web

Muchas tecnologías avanzan vertiginosamente hacia un futuro que seguramente no podamos ni imaginar. Este mismo futuro no nos permite ni un solo descanso y nos obliga a seguir aprendiendo. En el área del desarrollo y programación web pasa lo mismo.

Cada cierto tiempo los lenguajes de programación como ASP.Net, PHP, silverlight, etc. realizan cambios y mejoras en su framework aumentando, refinando y adaptando su funcionalidad y, al mismo tiempo, dejando poco a poco obsoletas versiones anteriores.

Por eso es recomendable utilizar las últimas tecnologías al servicio de los clientes. Tecnologías Web:

  • Web 2.0 – jQuery, XHTML, HTML5, AJAX
  • PHP 5.x
  • .Net 4.0 y .Net 4.5 – ASP.Net, Silverlight, Web Services, WCF, Entity Framework
  • CMS – Joomla! 2.5, joomla! 3.0, Drupal 7, WordPress 3.x
  • Datos y SGDB – SqlServer, Oracle, MySql, Pervasive, ODBC, XML, csv…
  • Servidores Web – IIS 6, IIS 7 y Apache.

Si lo prefiere para posibles mantenimientos de antiguos sitios web también tengo amplia experiencia en las versiones anteriores de PHP, ASP Clásico, ASP.Net (1.0, 2.0, 3.0 y 3.5) y joomla 1.6