2016-06-12 24 views
17

ASPコアWeb APIを使用して、DBがEFコアを使用した最新の移行に移行されることを保証できますか?これはコマンドラインで行うことができますが、私はプログラムでそれをやりたいのです。 Janshairカーンからの回答をもとにASPコア - 起動時のEFコアSQL DB

更新

私はこのヘルパークラスを思い付いた:

using Microsoft.AspNetCore.Builder; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.DependencyInjection; 
using MyWebApi.Models; 

namespace MyWebApi 
{ 
    public static class DataSeeder 
    { 
     public static void SeedData(this IApplicationBuilder app) 
     { 
      var context = app.ApplicationServices.GetService<MyContext>(); 

      if (!context.Database.EnsureCreated()) 
       context.Database.Migrate(); 
     } 
    } 
} 

あなたはこのようなあなたのStartup.csConfigure方法からこれを呼び出すことができます。

app.SeedData(); 
+0

で移行を実行するためのコードの下に使用することはまだそれが次のバージョンで実装する必要があります行われていません。あなたはKhanの下に掲載された回避策を使うことができます。 –

+0

下記の回答をご覧ください。 EnsureCreatedまたはMigrateを使用する必要があります。両方ではありません。 –

答えて

13

db.Database.EnsureCreated(); 

あなたの現在のモデルで最新のデータベースを入手できます。移行を有効にする場合は(その後の移行が疑われる場合)、

db.Database.Migrate(); 

を使用して、その後の移行を行います。

+0

EnsureCreated()は正常に動作していますが、 "context.Database.Migrate()"にはMigrate()メソッドがありません。なぜですか? EFコア – Floxy

10

db.Database.EnsureCreated()への呼び出しのドキュメントからのノート:

(注)このAPIは、データベースを作成するために、移行を使用しないこと。 では、作成されたデータベースは、 の移行を使用して後で更新することはできません。リレーショナルデータベースをターゲットにして、 の移行を使用する場合は、DbContext.Database.Migrate()メソッドを使用して データベースを作成し、すべての移行が適用されるようにすることができます。

db.Database.Migrate()に電話してください。

上記の宣言で得られたコメントhere。 @steamrollaの回答に基づいて

1

私は次のような改善提案になります。例えば、あなたはまた、異なるコンテキストの移行を確保することができます。これにより

public static class EnsureMigration 
{ 
    public static void EnsureMigrationOfContext<T>(this IApplicationBuilder app) where T:DbContext 
    { 
     var context = app.ApplicationServices.GetService<T>(); 
     context.Database.Migrate(); 
    } 
} 

をアイデンティティデータベースがある場合

使用法:

app.EnsureMigrationOfContext<context>(); 
0

public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
    { 
     var context = serviceScope.ServiceProvider.GetService<YourContext`enter code here`>(); 
     context.Database.Migrate(); 
    } 
}