wake-up-neo.com

ASP.NET Core RC2 Seed Datenbank

Mein Problem ist, ich versuche, eine Entity Framework Core-Datenbank mit Daten zu säen, und in meinem Kopf zeigt der folgende Code die Arbeit. Ich habe erkannt, dass dies nicht im Konstruktor ApplicationDbContext und nicht startup aufgerufen werden sollte, aber ich bin mir nicht sicher, wie das geht. 

EDIT: Basierend auf der von Ketrex bereitgestellten Lösung sieht meine Lösung folgendermaßen aus:

Startup.cs:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ... 

        app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed();
    }

Samenverlängerung:

public static class DbContextExtensions
{
    public static void Seed(this ApplicationDbContext context)
    {
        // Perform database delete and create
        context.Database.EnsureDeleted();
        context.Database.EnsureCreated();

        // Perform seed operations
        AddCountries(context);
        AddAreas(context);
        AddGrades(context);
        AddCrags(context);
        AddClimbs(context);

        // Save changes and release resources
        context.SaveChanges();
        context.Dispose();
    }

    private static void AddCountries(ApplicationDbContext context)
    {
        context.AddRange(
            new Country { Name = "England", Code = "En" },
            new Country { Name = "France", Code = "Fr" }
            );
    }

    ...
}

Ich verstehe, dass das Seeding einer Datenbank in der Prioritätenliste von Entity Framework ganz oben steht, aber es wäre großartig, wenn es eine Dokumentation dafür gibt, wie man diese triviale Aufgabe löst oder zumindest eine temporäre Lösung bietet. Wenn jemand eine Anleitung dazu geben kann, wäre dies sehr dankbar. Ich habe das Gefühl, ich bin einer Lösung nahe, kann sie aber nicht zusammensetzen.

Danke für jede Hilfe.

11
Adam H

Angenommen, Sie verwenden den integrierten DI-Container. Hier haben Sie eine Möglichkeit, dies zu erreichen.

Verweisen Sie in der Configure-Methode Ihrer Startklasse auf Ihre Startmethode, und übergeben Sie das IApplicationBuilder-Objekt als Parameter anstelle von DbContext:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //...
    // Put this at the end of your configure method
    DbContextSeedData.Seed(app);
}

Ändern Sie als Nächstes Ihre Seed-Methode, um die IApplicationBuilder-Instanz zu akzeptieren. Dann können Sie eine Instanz von DbContext hochfahren und Ihre Seed-Operation wie folgt ausführen:

public static void Seed(IApplicationBuilder app)
{
    // Get an instance of the DbContext from the DI container
    using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
    {
        // perform database delete
        context.Database.EnsureDeleted;
        //... perform other seed operations
    }
}
11
Ketrex

Sie können auch die Methode ConfigureServices der Methode Startup.cs verwenden, um Ihren ApplicationDbContext verfügbar zu machen (Registrieren des dbcontext als Dienst):

public void ConfigureServices(IServiceCollection services)
{
   var connectionString = Startup.Configuration["connectionStrings:DBConnectionString"];//this line is not that relevant, the most important thing is registering the DbContext
            services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(connectionString));
}

fügen Sie dann Ihren ApplicationDbContext als Abhängigkeit in Ihre Configure-Methode ein, die Ihre Seed-Erweiterungsmethode aufruft.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext myApplicationDbContext)
{
    //...
    myApplicationDbContext.Seed();
}

Schließlich kann die Seed-Methode eine schnelle Überprüfung einer wichtigen Tabelle durchführen, da die Neuerstellung der Datenbank möglicherweise zu schwer ist:

public void Seed()
{
 //....      
 if(context.Countries.Any())
   return;
 //...
}

Ich hoffe es hilft dir oder jemand anderem, zumindest als eine andere Option.

4
darmis

Wenn Sie Ihren EF-Code aus einer separaten Klassenbibliothek ausführen und Seeding ausführen möchten, können Sie Folgendes tun. Dies verwendet TSQL ...

1) Erstellen Sie eine neue Klassenbibliothek. Fügen Sie die folgenden Abhängigkeiten mit NuGet hinzu ...

Microsoft.AspNetCore
Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

2) Richten Sie die Package Manager Console auf dieses Projekt und führen Sie ...

PM> add-migration Seeder01

dann...

PM> update-database

dies gibt Ihnen eine leere Migration.

3) Aktualisiere das Skript wie ...

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace Test02.Data.Migrations
{
    public partial class Seeder01 : Migration
    {

        protected override void Up(MigrationBuilder migrationBuilder)
        {
            string sql = string.Empty;

            sql = "SET IDENTITY_INSERT State ON;";
            sql += "Insert into State (Id, Name) values ";
            sql += "(2, 'NSW'),";
            sql += "(3, 'VIC'),";
            sql += "(4, 'QLD'),";
            sql += "(5, 'SA')";
            sql += ";";
            sql += "SET IDENTITY_INSERT State OFF;";
            migrationBuilder.Sql(sql);

        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            string sql = string.Empty;
            sql = "delete State;";
            migrationBuilder.Sql(sql);


        }
    }
}

4) Rückkehr zur vorherigen Migration mit ...

PM> add-migration {PriorMigrationName}

Laden Sie die Seed-Migration erneut und aktualisieren Sie die Datenbank ...

PM> add-migration Seeder01
PM> update-database
0
CYoung