Migrazione di Entity Framework 7 non crea tabelle

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

Domanda

Sto lavorando con il mio primo progetto utilizzando Entity Framework 7 e mi sto collegando a un server SQL in cui il database è già stato creato ma non ci sono ancora tabelle in esso. Ho creato il mio DbContext e creato una classe, quindi DbSet<> impostato un DbSet<> nel mio contesto. Ho eseguito i comandi per abilitare le migrazioni e creare la prima migrazione, quindi eseguire il comando per aggiornare il database. Tutto sembrava funzionare, nessun errore, ma quando guardo il database è stata creata solo la tabella EFMigraitonsHistory . Quando guardo la classe che è stata creata per la migrazione iniziale è essenzialmente vuota. Che cosa sto facendo di sbagliato?

I comandi che sto eseguendo:

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

Contesto:

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

Classe tabella:

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"]);
                });
    }

Classe di migrazione iniziale (autogenerata da EF):

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

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

Modifica: dopo aver fatto ciò che Poke ha suggerito, questa è la mia nuova migrazione generata automaticamente. La tabella non è ancora stata creata a livello di database però.

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");
        }
    }
}

Risposta accettata

Devi prima impostare l'entità nel tuo contesto di database. Per lo meno, dovresti fare questo:

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

    modelBuilder.Entity<NavigationMenu>();
}

Il problema con le tue migrazioni era un po 'nascosto nel layout del tuo progetto. Quindi quello che hai è un progetto JobSight.DAL che contiene le entità e il contesto del database. E poi hai un progetto JobSight.WebUI che è il vero progetto ASP che contiene Startup.cs con l'installazione del database.

Questo sta causando problemi perché per impostazione predefinita EF supporterà solo di trovare tutto nell'assieme corrente. Quindi, se stai lanciando il comando ef dal tuo progetto web, creerà le migrazioni lì anche se il contesto è in un altro progetto. Ma quando stai provando ad applicare la migrazione, EF non la troverà poiché guarderà solo nel progetto del contesto.

Quindi, per risolvere questo problema, è necessario creare le migrazioni nel progetto DAL . Puoi farlo specificando il progetto quando chiami il comando ef :

dnx ef migrations add Example -p JobSight.DAL

È possibile verificare che ciò ha funzionato eseguendo in seguito l' dnx ef migrations list . Questo dovrebbe ora restituire la migrazione di Example ; in precedenza, quel comando non restituiva nulla: non riusciva a trovare una migrazione, motivo per cui il comando di update diceva solo Done (senza applicare la migrazione) e il database non veniva creato. Quindi, se ora ottieni la migrazione, puoi applicarla utilizzando:

dnx ef database update

Si noti che poiché la migrazione viene ora creata nel progetto DAL, è necessario aggiungere un riferimento a EntityFramework.MicrosoftSqlServer , altrimenti il ​​progetto non verrà compilato. È necessario farlo prima di poter eseguire il comando list sopra.

Infine, per ulteriori informazioni su questo, vedere questo problema .


Risposta popolare

Anche se questa non è la risposta alla domanda originale, inserisco qui la mia risposta perché potrebbe aiutare qualcuno che ha un problema simile. Il mio problema era anche che le tabelle non erano state create, ma le dotnet ef migrations add InitialCreate ha creato 3 file .cs nella cartella Migrations . Ma l' dotnet ef database update creato solo la tabella MigrationsHistory e l' dotnet ef migrations list non ha restituito alcuna migrazione.

Si è scoperto che il problema era che la cartella Migrations è stata esclusa dal progetto Visual Studio. Una volta che l'ho incluso di nuovo, tutto ha funzionato bene.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché