2016-06-26 28 views
9

Mój problem polega na tym, że próbuję zasiać bazową bazę danych Entity Framework z danymi, aw myślach poniższy kod pokazuje pracę. Zdałem sobie sprawę, że to nie powinno być wywoływane w konstruktorze ApplicationDbContext i powinno być wywoływane z startup, ale nie jestem pewien, jak to zrobić.Baza jądrowa ASP.NET Core RC2

EDIT: W oparciu o rozwiązania dostarczone przez Ketrex, moje rozwiązanie jest następujące:

Startup.cs: rozbudowa

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

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

Seed:

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

    ... 
} 

Rozumiem, że zaszczepienie baza danych znajduje się dość wysoko na liście priorytetów dla Entity Framework, ale byłoby wspaniale, gdyby istniała jakaś dokumentacja dotycząca tego, jak osiągnąć to banalne zadanie lub przynajmniej zapewnić tymczasową pracę okrągły. Jeśli ktoś może udzielić wskazówek, jak to zrobić, byłoby to bardzo cenne. Czuję, że jestem bliski rozwiązania, ale nie mogę tego złożyć.

Dzięki za pomoc.

Odpowiedz

9

Zakładając, że korzystasz z wbudowanego pojemnika DI, możesz to zrobić w jeden sposób.

referencyjny metoda nasion w metodzie Konfiguracja swojej klasie startowej i przekazać obiekt IApplicationBuilder jako parametr zamiast DbContext, tak:

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

Następnie zmodyfikować metodę nasion do przyjęcia IApplicationBuilder instancja. Wtedy będziesz w stanie obracać się wystąpienie DbContext i wykonywać swoją pracę z nasion, jak to:

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 
    } 
} 
+0

Dziękuję bardzo! Był to wiersz 'app.ApplicationServices.GetRequiredService ()' którego mi brakowało. Zmodyfikowałem nieco twoje rozwiązanie, aby użyć go jako metody rozszerzenia. –

+0

problem: context.Database.EnsureDeleted() usuń __EFMigrationsHistory również !!! –

+1

@MohammadAkbari wygląda na to, że wybierasz gnidy. Zauważ, że linia // wykonuje inne operacje związane z ziarnem nasion ? Wyraźnie oznacza, że ​​może wykonywać inne operacje. Problemem, o którym tu mówiono, było wstrzyknięcie kontekstu do metody nasiennej. – Ketrex

2

Można również skorzystać z metody Startup.cs ConfigureServices aby Państwa ApplicationDbContext dostępny (Rejestrowanie dbcontext jako usługa):

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

a następnie dodać ApplicationDbContext jako zależność w sposób Configure które nazywają swoją metodę rozszerzenia nasion.

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

Wreszcie metoda nasienie może zrobić szybki test na ważnym stole, ponieważ może odtwarzając dB jest zbyt ciężki:

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

Mam nadzieję, że to pomaga lub kogoś innego, przynajmniej jako kolejny opcja.

0

Jeśli chcesz uruchomić kod EF z oddzielnej biblioteki klas i wykonaj Rozsiewanie, możesz wykonać następujące czynności. To używa TSQL ...

1) Utwórz nową bibliotekę zajęć. Dodaj następujące zależności z Nuget ...

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

2) Pkt konsoli Menedżer pakietów w tym projekcie i uruchomić ...

PM> add-migration Seeder01 

potem ...

PM> update-database 

To daje pustą migrację.

3) Script aktualizacje za coś takiego jak ...

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) Przywracanie wcześniejszej migracji z ...

PM> add-migration {PriorMigrationName} 

przeładować migrację nasion i aktualizuje bazę danych ..

PM> add-migration Seeder01 
PM> update-database 
Powiązane problemy