La migración de Entity Framework 7 no crea tablas

asp.net-core c# entity-framework-core

Pregunta

Estoy trabajando con mi primer proyecto utilizando Entity Framework 7 y me estoy conectando a un servidor SQL donde la base de datos ya está creada pero todavía no hay tablas. He creado mi DbContext y una clase, luego establezco un DbSet<> dentro de mi contexto. Ejecuté los comandos para habilitar las migraciones y crear la primera migración, luego ejecuté el comando para actualizar la base de datos. Todo parecía funcionar bien, no surgieron errores, pero cuando miro la base de datos, solo se creó la tabla EFMigraitonsHistory . Cuando veo la clase que se creó para la migración inicial, está esencialmente en blanco. ¿Qué estoy haciendo mal?

Comandos que estoy ejecutando:

dnvm install latest -r coreclr
dnx ef migrations add MyFirstMigration
dnx ef database update

Contexto:

namespace JobSight.DAL
{
    public class JobSightDBContext : DbContext
    {
        public DbSet<NavigationMenu> NavigationMenu { get; set; }
    }
}

Clase de mesa:

namespace JobSight.DAL
{
    public class NavigationMenu
    {
        [Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int16 ID { get; set; }

        public string ControllerName { get; set; }
        public string ActionName { get; set; }
        public string ExternalURL { get; set; }
        public string Title { get; set; }
        public Int16? ParentID { get; set; }

        public virtual NavigationMenu Parent { get; set; }
    }
}

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<JobSightDBContext>(options =>
                {
                    options.UseSqlServer(Configuration["Data:JobSightDatabase:ConnectionString"]);
                });
    }

Clase para la migración inicial (autogenerada por EF):

namespace JobSight.WebUI.Migrations
{
    public partial class Initial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
        }
    }
}

Editar: Después de hacer lo que Poke ha sugerido, esta es mi nueva migración autogenerada. Sin embargo, la tabla aún no se está creando en el nivel de la base de datos.

namespace JobSight.WebUI.Migrations
{
    public partial class MyFirstMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "NavigationMenu",
                columns: table => new
                {
                    ID = table.Column<short>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    ActionName = table.Column<string>(nullable: true),
                    ControllerName = table.Column<string>(nullable: true),
                    ExternalURL = table.Column<string>(nullable: true),
                    ParentID = table.Column<short>(nullable: true),
                    Title = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_NavigationMenu", x => x.ID);
                    table.ForeignKey(
                        name: "FK_NavigationMenu_NavigationMenu_ParentID",
                        column: x => x.ParentID,
                        principalTable: "NavigationMenu",
                        principalColumn: "ID",
                        onDelete: ReferentialAction.Restrict);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable("NavigationMenu");
        }
    }
}

Respuesta aceptada

Primero debe configurar la entidad en el contexto de su base de datos. Como mínimo, deberías hacer esto:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<NavigationMenu>();
}

El problema con sus migraciones estaba un poco oculto en el diseño de su proyecto. Entonces, lo que tienes es un proyecto JobSight.DAL que contiene las entidades y el contexto de la base de datos. Y luego tienes un proyecto JobSight.WebUI que es el proyecto ASP real que contiene Startup.cs con la configuración de la base de datos.

Esto está causando problemas porque, de manera predeterminada, EF simplemente asumirá que encontrará todo en el ensamblaje actual. Entonces, si está ejecutando el comando ef desde su proyecto web, creará las migraciones allí incluso si el contexto está en otro proyecto. Pero cuando intenta aplicar la migración, EF no la encontrará ya que solo se verá en el proyecto del contexto.

Entonces, para solucionar este problema, debe crear las migraciones en el proyecto DAL . Puede hacerlo especificando el proyecto cuando llame al comando ef :

dnx ef migrations add Example -p JobSight.DAL

Puede verificar que esto funcionó ejecutando la dnx ef migrations list posteriormente. Esto ahora debería devolver la migración de Example ; anteriormente, ese comando no devolvió nada: no se pudo encontrar una migración, por lo que el comando de update solo dijo Done (sin aplicar la migración) y la base de datos no se creó. Entonces, si ahora obtiene la migración allí, puede aplicarla usando:

dnx ef database update

Tenga en cuenta que, dado que la migración ahora se crea en el proyecto DAL, debe agregar una referencia a EntityFramework.MicrosoftSqlServer allí, de lo contrario el proyecto no se compilará. Debe hacerlo antes de poder ejecutar el comando de list anterior.

Finalmente, para más información sobre esto, vea este problema .


Respuesta popular

Aunque esta no es la respuesta a la pregunta original, publico mi respuesta aquí porque podría ayudar a alguien que tenga un problema similar. Mi problema también fue que las tablas no se crearon, pero las dotnet ef migrations add InitialCreate creó 3 archivos .cs en la carpeta Migrations . Pero la dotnet ef database update solo creó la tabla MigrationsHistory y la dotnet ef migrations list no devolvió ninguna migración.

Resultó que el problema era que la carpeta Migraciones estaba excluida del proyecto de Visual Studio. Una vez que lo volví a incluir, todo funcionó bien.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué