2017-07-17 13 views
1

Entity Framework Coreを使用して、テーブルがまだ存在しない場合は作成する方法がありますか?例外で存在しないテーブルを作成しますか?

DbSet<Ticker> Ticker { get; set } 
Database.EnsureCreated(); 

Ticker.Add(...); 
dbctx.SaveChanges(); <== exception 

結果::

System.Data.SqlClient.SqlException:無効なオブジェクト名 'ティッカー'

される例外はEnsureCreatedがコンテキストで呼び出された場合でもスローされますデータが挿入される前にテーブルTickerを作成する方法はありますか?

== EDITの==

この質問は、データベース全体を移行/作成することはありませんが、データベースが常に存在し、そのテーブルのほとんども存在するが、テーブルの一部ではないことがあります。ですから、実行時に1つまたは2つのテーブルを作成するだけで済みます。

+0

[チェックの可能性のある重複したテーブルの場合LINQを使用してデータベース内に存在する](https://stackoverflow.com/questions/5218489/check-if-a-table-exists-within-a-database-using-linq) – Guy

+0

@Guyそれを行う方法はありませんか? – fluter

+0

テーブルが存在するかどうかを確認し、存在しない場合は作成することをお勧めします。 – Guy

答えて

0

はい、あります。 EFCoreでは、モデルが完成すると、データベースを作成するために移行を使用する必要があります。より詳細な概要については、これらの2つのチュートリアルを見てください。

tutorial 1

tutorial 2

4

あなたはここにいくつかのオプションがあります。最も簡単なものは行うことです。

MyContext.Database.CreateIfNotExists(); 

それとも、あなたのコンテキストのコンストラクタでこれを置くことによって、それを初期化スタイルの操作を行います。

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

これらの両方が手動であなたが持つたびに、あなたのスキーマを削除する必要がモデルを修正し、データベースを再作成する必要があります。あなたがいることをしたくない場合は、代わりに次の初期化を使用することができます。

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

これは、データベースに対して、あなたのプログラムを実行すると、自動的場合は、データベースを削除し、再作成するたびに、あなたのモデルをチェックしますモデルが変更されました。

EDIT:

あなたは、あなたが次の初期化を使用することができ、データベースをドロップしたい、と単純にそれを更新しない場合:

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>()); 
+1

私はデータベースを作成していない、dbは常に存在する、私はテーブルが存在しない場合はテーブルを作成する必要があります。 – fluter

+0

@fluter編集を確認してください。 – stybl

+1

ありがとうございます。しかし、あなたの例を試したときに、 'SetInitializer'メソッドがEFCoreに存在しません:https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.infrastructure.databasefacade# Microsoft_EntityFrameworkCore_Infrastructure_DatabaseFacade – fluter

関連する問題