Crear nueva tabla utilizando Code First

Tengo una aplicación que corre mensualmente y almacena información de cada mes, esta información la he separado en distintas tablas que se nombran según el mes en curso, necesitaría mediante Code First que esta me creara en la misma base de datos una nueva tabla con el nombre del mes, y que cuando se volviera a ejecutar el próximo mes no me sobrescriba ni borre las tablas existentes.

1 respuesta

Respuesta
1

Viendo como lo tienes montando he de decirte que con Code First no puedes hacerlo ya que para ello necesitarías tener una clase por cada mes con las mismas propiedades ya creadas en tu aplicación para poder mapearla contra tu base de datos.

Esto implicaría tener que publicar una versión nueva de tu aplicación cada mes para poder tener esa nueva clase (llamada, por ejemplo Febrero2015. Cs ) que tendría exactamente las mismas propiedades que Enero2015. Cs lo cual es ineficiente, trabajoso e innecesario.

Quizá se podrían usar SqlMigrations pero estamos ante el mismo problema... necesitarías una entidad nueva cada mes.


Para hacer lo que quieres, es decir, crear una tabla cada nueva cada vez que se ejecute tu aplicación (partiendo de la premisa que se ejecuta cada mes) e introducir datos, haría uso de las herramientas que te proporciona Entity Framework para crear a mano la nueva tabla y mapearla hacia tu entidad genérica.

Lo primero que debemos hacer es crear la nueva tabla, eso es tan sencillo como lanzar una sql manualmente antes de crear el contexto de EntityFramework. Como el nombre de la tabla cambia cada mes primero deberíamos crear una variable estática a la aplicación con el nombre de la tabla (voy a poner todo mi código de ejemplo en c#):

public static string NombreTabla =  string.Format("Datos_{0}_{1}", DateTime.Now.Month, DateTime.Now.Year);

Con la variable estática creada ya podemos lanzar, lo primero de todo, el script de creación de tabla:

var sql = string.Format("CREATE TABLE {0} ....", ClaseEstatica.NombreTabla);
using (SqlCommand command = new SqlCommand(sql , connectionString))
command.ExecuteNonQuery();

Vale, ya tenemos nuestra tabla creada (ese código es muy mejorable... habría que comprobar que la tabla no existe o no tiene datos... pero vamos, te haces una idea).

Vamos a mapearla.

Supongamos que tenemos la clase DatosMes que representa la entidad que queremos persistir en la tabla nueva.

Por convención, en Entity Framework, al mapear esta entidad con tu base de datos lo hará contra la tabla DatosMeses con lo cual los datos estarían añadiendose a la misma tabla mes a mes y eso no es lo que queremos.

Para hacer que DatosMes se mapee con ClaseEstatica. NombreTabla tenemos que crear una clase de configuración de EntityFramework específica para esta entidad:

public class DatosMesEFConfiguration : EntityTypeConfiguration<DatosMes>
    {
        public DatosMesEFConfiguration ()
        {
            this.ToTable(ClaseEstatica.NombreTabla);
        }
    }

¡Y listo! Con esto ya tenemos Entity Framework configurado para usar una tabla con nombre dinámico que creamos al principio de la aplicación y mapeada contra tu entidad para poder usar el ORM como de costumbre.

Con todo, decir que esto que planteas es bastante excéntrico y estoy seguro de que hay aproximaciones mejores que tener que crear tablas nuevas cada mes (yo lo tendría todo en la misma y filtraría por mes/año creando índices para que las consultas fueran rápidas).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas