Archivo de la categoría: Programación

Temas relacionados con la programación en general. Lenguajes .Net, java, python, C#, Visual Basic, C…

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.

Copiar una solución quitando git

Si tenemos una aplicación en visual studio que está enlazada a git y queremos copiarla en otro lugar quitando git lo que hay que hacer es tan sencillo como copiar el contenido de toda la solución salvo los ficheros de git.

¿Cuáles son los ficheros de git en una solución de visual studio?

Son los siguientes:

contenidogitsolucionvs

Si nos fijamos el directorio .git está como fichero oculto y para visualizarlo será necesario que cambies tu configuración del explorador de ficheros de windows.

Para copiar una solución quitando git lo que deberás borrar son estos ficheros una vez copiada.

Error de validación de viewstate MAC

En el supuesto de que instales tu aplicación web en una granja de servidores debes tener en cuenta que es posible que la validación del viewstate no se comporte correctamente. Como sabemos para un programador esto es un problema porque son errores que no se producen en nuestro equipo local de desarrollo sino que es en el despliegue.

El error

El error en cuestión es el siguiente:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey>….

ViewState MAC Farm

¿Por qué este error?

Como sabemos en asp.net existe el concepto del viewstate que permite guardar el estado de ciertos controles y partes de la página para ser reutilizados después de un postback. Esto que a priori es una ventaja implica el inconveniente de que un usuario malintencionado envíe una carga _VIEWSTATE y engañe a la aplicación y realice una acción que no se debería realizar.

Para evitar este tipo de ataque el campo _VIEWSTATE se protege codificándolo con un código de autenticación de mensajes (MAC). ASP.Net valida el MAC que se envía con la  carga cuando se produce un postback, si no coincide se produce un error en la validación del viewstate.

La clave que se utiliza para calcular el MAC está en el elemento machineKey de la aplicación en el archivo web.config.

Una de las causas más comunes que provocan este error es que nuestra aplicación está en una granja de servidores, en este caso cada uno de los servidores generará una machineKey para nuestra app y entonces ninguno acordará cual aplicar.

Solución

La mejor solución y más sencilla es aplicar una machineKey explícitamente en nuestro web.config. De esta manera cualquier servidor que pretenda ejecutar nuestra aplicación utilizará de manera obligada la clave que le establezcamos en este fichero.

¿Cómo generamos nuestra clave machinekey?

Para generarlo tenemos varias maneras pero yo recomiendo nunca utilizar sitios web donde se generan automáticamente ya que no sabemos si estas claves se han generado de forma segura o son guardadas para posibles usos malintencionados, buff ya sé que suena muy rebuscado pero no nos podemos fiar, solo debemos usar las claves generadas por nosotros mismos.

En este link podemos ver varias maneras para crear el machine.config.

¿En qué sección del web.config editamos nuestra machinekey?

El elemento <machineKey> solo es válido en el archivo Web.config en la raíz de la aplicación y no es válido en el nivel de subcarpeta (location).

<configuration>
  <system.web>
    <machineKey ... />
  </system.web>
</configuration>

 

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.

 

 

Cómo localizar identity de asp net

En esta entrada haremos una pequeña explicación de cómo localizar identity de asp net.

Cuando utilizamos esta nueva característica de asp.net nos daremos cuenta que los mensajes de error propios de la validación tanto de la entidad como de negocio aparecen siempre en inglés.

La solución más sencilla para poder utilizar otras traducciones de identity será la instalación de un paquete a través de la consola de administración de paquetes con el siguiente comando:

install-package Microsoft.AspNet.Identity.Core.xx

Las últimas letras indican el idioma que queramos instalar, por ejemplo para español sería es.

install-package Microsoft.AspNet.Identity.Core.es

Una vez instalado los errores aparecerán (en este caso concreto) en castellano.

Envío de Mails con ELMAH

El envío de mails con ELMAH es una de las muchas virtudes que tiene este sistema de control de errores. En este post intentaré explicar cómo se configura.

Nota: partiremos de una instalación correcta de ELMAH. Si no sabes instalar y configurar ELMAH te recomiendo este post.

Paso 1: configurar una cuenta de correo en el web.config.

En realidad este paso no es propio de ELMAH, en el web.config se puede establecer muchos parámetros que puedes o no utilizar cuando desarrolles tus aplicaciones o software.

Para añadir una cuenta de correo deberemos abrir una sección llamada <system.net> dentro de la raíz <configuration> del web.config.

Como una imagen vale más que mil palabras aquí está la configuración completa:

Envio de mails con ELMAH

Como vemos establecemos el servidor  smtp, el puerto, el nombre de usuario y la contraseña de la cuenta.

Paso 2. Indicar a ELMAH datos del envío de correo.

El segundo paso sí que tiene lugar en la sección propia de ELMAH dentro del web.config. De nuevo podemos en una imagen como configurarlo:

Configurar envio mail con elmah

En la imagen vemos que estableceremos el campo «from» (dirección remitente del correo), el campo «to» (destinatario) y el asunto «subject».

Si nos fijamos el asunto tiene el código {0} que indica que en esa posición se sustituirá el mensaje del error de tal modo que el destinatario podrá ver de una manera rápida en que consiste el problema.

Modificar url de acceso elmah axd

Por seguridad es mejor cambiar la url donde se accederá a los errores de aplicación de ELMAH. Como sabemos en el momento de la instalación la url de acceso es la siguiente:

http://»misitio.com»/elmah.axd

Si queremos cualquier otra como por ejemplo:

http://»misitio.com»/mis_errores.axd

Deberemos reemplazar en el web.config todas las ocurrencias que encontremos de «elmah.axd» por «mis_errores.axd»

Acceso remoto en ELMAH

El acceso remoto en ELMAH por defecto está desactivado.

Esto quiere decir que solo podremos acceder a nuestra pantalla de monitorización si accedemos desde la misma IP donde está el hosting de nuestra aplicación.

Dependiendo si queremos acceder únicamente desde nuestro equipo servidor o desde cualquier equipo tenemos la posibilidad de configurarlo a través del web.config.

Dentro de la sección de configuración <elmah> existe una etiqueta <security> donde su propiedad «allowremoteaccess» nos permitirá activar o desactivar el acceso remoto.

acceso remoto elmah