2016-06-26 6 views
9

내 문제는 데이터로 Entity Framework 핵심 데이터베이스를 시드하려고하고 있으며 아래 코드 작업이 마음에 들었습니다. 나는 이것이 ApplicationDbContext 생성자에서 호출되어서는 안되며 startup에서 호출되어야하지만이 작업을 수행하는 방법을 잘 모르겠다는 것을 깨달았다.ASP.NET 핵심 RC2 시드 데이터베이스

Startup.cs :

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

     app.ApplicationServices.GetRequiredService<ApplicationDbContext>().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" } 
      ); 
    } 

    ... 
} 

나는 시드 이해 다음과 같이 Ketrex가 제공하는 솔루션을 기반으로, 내 솔루션입니다 데이터베이스는 Entity Framework의 우선 순위 목록에서 상당히 높습니다. 그러나이 간단한 작업을 수행하는 방법에 대한 문서가 있거나 적어도 임시 작업을 제공하는 것이 좋습니다. 일주. 누군가가이를 수행하는 방법에 대한 지침을 제공 할 수 있다면 크게 감사하겠습니다. 나는 내가 해결책에 가깝다고 느낀다.

도움 주셔서 감사합니다.

답변

9

내장 된 DI 컨테이너를 사용한다고 가정하면 다음과 같이 할 수 있습니다.

참조 시동 클래스의 구성 방법에 종자 방법과 같이, 대신 DbContext의 매개 변수로 IApplicationBuilder 객체를 전달합니다

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

다음으로, IApplicationBuilder을 받아 들일 당신의 씨앗 방법을 수정 예.

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

정말 고마워요! 이 줄은'app.ApplicationServices.GetRequiredService ()'입니다. 확장 방법으로 사용하기 위해 솔루션을 약간 수정했습니다. –

+0

문제 : context.Database.EnsureDeleted() delete __EFMigrationsHistory 또한 !!! –

+1

@ 모함마드 반갑습니다. 당신은 새끼를 뽑는 것 같습니다. // ... 다른 시드 작업 행을 수행 하시겠습니까? 그것은 그가 수행 할 다른 작업을 할 수 있음을 분명히 암시합니다. 여기서 다루는 문제는 컨텍스트를 시드 메서드에 주입하는 것입니다. – Ketrex

2

당신은 또한 당신의 ApplicationDbContext 사용할 수 있도록 Startup.cs ConfigureServices 방법에서 사용할 수있는합니다 (등록 : 그럼 당신은이처럼 DbContext의 인스턴스를 회전하고 종자 작업을 수행 할 수 있습니다 서비스로 dbcontext) :

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

다음은 종자 확장 메서드를 호출하여 Configure 방법에 의존로 ApplicationDbContext를 추가합니다. 나는 그것이 적어도 다른, 당신이나 다른 사람을 도움이되기를 바랍니다

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

: 아마도 DB를 다시하는 것은 너무 무거운 때문에

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

마지막으로 종자 방법은 중요한 테이블에 빠른 검사를 할 수있는 선택권.

0

별도의 클래스 라이브러리에서 EF 코드를 실행하고 Seeding을 수행하려면 다음을 수행하십시오. 이것은 TSQL을 사용하고 있습니다 ...

1) 새 클래스 라이브러리를 만듭니다. 다음 ...

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

2)이 프로젝트에서 패키지 관리자 콘솔을 지적하고 실행 ... NuGet으로

PM> add-migration Seeder01 

를 다음 종속성을 추가 ...

PM> update-database 

이렇게하면 마이그레이션이 비어있게됩니다.

3)과 같이 같은 스크립트 업데이트는 ...

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) ...

PM> add-migration {PriorMigrationName} 

다시로드로 마이그레이션하기 전에 종자 마이그레이션을 되돌리기 및 데이터베이스를 업데이트 ..

PM> add-migration Seeder01 
PM> update-database