Dati iniziali seme in Entity Framework 7 RC 1 e ASP.NET MVC 6

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

Domanda

Sembra che in Entity Framework 7 non sia ancora disponibile il supporto nativo per i dati di seed ( https://github.com/aspnet/EntityFramework/issues/629 ).

Non esiste una classe DbMigrationsConfiguration , nessun metodo Seed nel codice del modello fornito da Microsoft.

Quindi, come seminare i dati nell'applicazione web ASP.NET MVC 6 che utilizza Entity Framework 7 RC 1?

Risposta accettata

Ho trovato una soluzione temporanea per me stesso.

Possiamo creare un metodo SeedData che estende IApplicationBuilder quindi ottiene un'istanza della nostra classe di contesto del database tramite il metodo GetService e la utilizza per la semina dei dati.

Ecco come appare il mio metodo di estensione:

using Microsoft.AspNet.Builder;
using Microsoft.Extensions.DependencyInjection;

public static class DataSeeder
{
    // TODO: Move this code when seed data is implemented in EF 7

    /// <summary>
    /// This is a workaround for missing seed data functionality in EF 7.0-rc1
    /// More info: https://github.com/aspnet/EntityFramework/issues/629
    /// </summary>
    /// <param name="app">
    /// An instance that provides the mechanisms to get instance of the database context.
    /// </param>
    public static void SeedData(this IApplicationBuilder app)
    {
        var db = app.ApplicationServices.GetService<ApplicationDbContext>();

        // TODO: Add seed logic here

        db.SaveChanges();
    }
}

Per usarlo, app.SeedData(); riga nel metodo Configure della classe di Startup dell'applicazione (che si trova nel progetto Web nel file chiamato Startup.cs ).

// This method gets called by the runtime.
// Use this method to configure the HTTP request pipeline.
public void Configure(
    IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    app.SeedData();

    // Other configuration code
}

Risposta popolare

Per EF Core RTM 1.0 e ASP.NET Core RTM 1.0

Prima crea il metodo seme. Qui perché siamo fuori dallo scopo della richiesta corrente, dobbiamo crearlo manualmente:

using System.Collections.Generic;
using System.Linq;
using Core1RtmEmptyTest.Entities;
using Microsoft.Extensions.DependencyInjection;

namespace Core1RtmEmptyTest.Migrations
{
    public static class ApplicationDbContextSeedData
    {
        public static void SeedData(this IServiceScopeFactory scopeFactory)
        {
            using (var serviceScope = scopeFactory.CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
                if (!context.Persons.Any())
                {
                    var persons = new List<Person>
                    {
                        new Person
                        {
                            FirstName = "Admin",
                            LastName = "User"
                        }
                    };
                    context.AddRange(persons);
                    context.SaveChanges();
                }
            }

        }
    }
}

Quindi specificare la durata corretta di ApplicationDbContext

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(ServiceLifetime.Scoped);

E infine chiamare il metodo SeedData() dal metodo Configure

public void Configure(IServiceScopeFactory scopeFactory)
{
    scopeFactory.SeedData();


Related

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é