2017-02-20 10 views
23

.NETコアに移植されているアプリケーションは、SQLiteで新しいEFコアを使用します。私は、アプリケーションが最初に実行されたときに自動的にデータベースとテーブル構造を作成したいと思います。私は、エンドユーザがこれらのコマンドを入力したくないとアプリが最初に使用するデータベースを作成し、セットアップ持つことを好むだろうが、これはマニュアルを使用して行われEFコアのドキュメントによるとEntity Frameworkコアのデータベースを自動作成

dotnet ef migrations add MyFirstMigration 

dotnet ef database update 

を指令します。 EF 6については、

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>()); 

のような機能がありますが、EFコアではこれらは存在しないようです。私は、EFコアと同等のものに関するサンプルやドキュメントを見つけることができず、EFコアのドキュメントに欠けている機能のリストには記載されていません。私はモデルクラスを既にセットアップしているので、モデルに基づいてデータベースを初期化するためのコードを書くことができますが、フレームワークが自動的にこれを行うと、ヒープがより簡単になります。モデルを自動構築したり、マイグレーションしたりするのではなく、新しいデータベースにテーブル構造を作成するだけです。

ここで何か不足していますか、またはEFコアに自動作成テーブル機能がありませんか?

答えて

22

移行を作成した場合は、Startup.csで次のように実行できます。

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

     ... 

追加された移行を使用してデータベースとテーブルが作成されます。代わりに

あなたは、Entity Frameworkの移行を使用していない場合は、とは単に、あなたが使用することができ、それが最初の実行では、あなたのコンテキストクラスであるとして、あなたのDbContextモデルを正確に作成した必要があります。その代わり

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
     using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) 
     { 
      var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); 
      context.Database.EnsureCreated(); 
     } 

     ... 

。あなたがEnsureCreated()を呼び出す直前に

  context.Database.EnsureDeleted(); 

から適応::あなたが前にそれが作成されますを確認することにデータベースを削除する必要がある場合

、呼び出しhttp://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html?highlight=entity

+0

私はまだかなりですEFの新機能では、現在のデータベースファイルを使用して、Visual StudioからEF 6コードを使用してデータ構造を定義するクラスを作成しました。その後、これらを新しいdotnet core VSソリューションにカット/ペーストしました。これらは移行ではないと思います。上記のコードを使用する前にマイグレーションファイルを作成する必要がありますか? – deandob

+0

あなたがマイグレーションを使用していない場合、申し訳ありませんが私の答えで間違いました、コマンドcontext.Database.EnsureCreated()/ EnsureDeleted()、https://blogs.msdn.microsoftで詳細を使用することができます。 com/dotnet/2016/09/29/implementation-seeding-custom-conventions-and-ef-core-1-0/ –

+0

よろしくお願いします。 – deandob

7

私の答えリカルドの答えに非常に似ていますが、彼のusingの機能には、私がそうしていることがあまりにも多いので、私のアプローチはちょっと単純です。どのように正確にそれが低いレベルで動作するかもわかりません。

ですから、ボンネットの下に起こっている内容を正確に把握あなたのためのデータベースを作成し、シンプルでクリーンなソリューションを求めている人達のために、これはあなたのためです:

public Startup(IHostingEnvironment env) 
{ 
    using (var client = new TargetsContext()) 
    { 
     client.Database.EnsureCreated(); 
    } 
} 

これはかなりの手段は、その内DbContextを作成した場合(この場合、私の名前はTargetsContextとなります)、DbContextのインスタンスを使用して、Startup.csがアプリケーションで実行されたときに、クラスで定義されたテーブルが作成されるようにすることができます。

+2

[ここ](https://github.com/aspnet/EntityFrameworkCore/issues/3160)の情報と同じです: 'EnsureCreated'は完全に移行をバイパスし、あなただけのためにスキーマを作成します。これを移行と混在させることはできません。 'EnsureCreated'は、テストやラピッドプロトタイピングのために設計されており、毎回データベースを削除して再作成することができます。移行を使用していて、アプリケーションの開始時に自動的に適用したい場合は、代わりに 'context.Database.Migrate()'を使うことができます。 –

+0

@ThomasSchneiterああ、クール!ありがとう!私は今まで知らなかった。 –

+0

この私の接続文字列が機能しない理由私の混乱に答える... :( ので、データベースは自動的にあなたが私は私のDbContextコンストラクタで行わDatabase.EnsureCreated()を指定しなければならないことを作成されていません。 ありがとうございました、私を節約3日間のジレンマから。X_X – pampi

1

移行を作成していない場合は、2つのオプションがあります。

1。アプリケーションのメインのデータベースとテーブルを作成します。

var context = services.GetRequiredService<YourRepository>(); 
context.Database.EnsureCreated(); 

2.createテーブルデータベースがすでに存在する場合:Bubiのanswer

2

var context = services.GetRequiredService<YourRepository>(); 
context.Database.EnsureCreated(); 
RelationalDatabaseCreator databaseCreator = 
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>(); 
databaseCreator.CreateTables(); 

おかげであなたは、パラメータを経由して、コンテキストを取得する場合Startup.csで設定のリスト、あなたは代わりにこれを行うことができます:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory, 
    ApplicationDbContext context) 
{ 
     context.Database.Migrate(); 
     ... 
関連する問題