27

エンティティ フレームワークの移行を機能させようとしています。コードの最初の移行を有効にしました。移行フォルダー、構成ファイル、および移行履歴テーブルが作成されましたが、最初の作成はありません。私はステップを逃していますか?これは、EF (4.3.1) によって作成された新しいデータベースです。

4

6 に答える 6

23

この動作はデフォルトでは設定されていませんが、さまざまな形で簡単に利用できます。

  1. context.Database.CreateIfNotExists();アプリ起動時に呼び出すことができます。

  2. 組み込みの のいずれかを使用できますDatabaseInitializer。初期化子はEntityFrameworkCreateDatabaseIfNotExistsに組み込まれており、プロジェクトに追加するだけで済みます。

  3. オプション #1 を内部に含む独自のカスタム データベース初期化子を作成できます。例: Code First の移行と初期化

コードまたは構成ファイルを使用して、プロジェクトに DatabaseInitializers を含めることができます。

コードを介して EntityFramework データベース初期化子を含めます。

アプリケーションの起動時に、次のように DatabaseInitializer をセットアップできます。

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>());

注: このコードは、entityframework の存続期間中に何度も変更されています。この例は、nuget から入手できる現在の製品リリースである EF 4.3 用です。

構成要素を介して EntityFramework データベース初期化子を含めます。

<configuration>
  <entityFramework>
    <contexts>
      <context type="MyNamespace.MyEFDataContext, AssemblyName">
        <databaseInitializer
          type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName],
               [MyNamespace.Migrations.Configuration,  AssemblyName]], EntityFramework" />
      </context>
    </contexts>
  </entityFramework>
</configuration>

この構成では、これが少し「優雅でない」場合があることに気付くでしょう。AssemblyName上記を、entityframework のものを保持するアセンブリの名前に置き換えMyNamespace.MyEFDataContext、entityframework データ コンテキストMyNamespace.Migrations.Configurationの完全修飾名に置き換え、構成クラスの完全修飾名に置き換える必要があります (既定では、事業)。

編集:追加のコメントに対応するために編集

移行とは、あるスキーマ定義から別のスキーマ定義への変更です。空のデータベースを作成することは移行ではありません (ただし、その後はすべて移行になります)。プロジェクトには、イニシャライザによってコードで行われる空のデータベースを作成するための移行ソース ファイルはありません。

すでにDropCreateDatabaseAlwaysイニシャライザを使用している場合は、それを行う必要があります。ただし、コードで初期化子を設定していることに気付きました。これは、タイミングの問題が発生する可能性があることを意味します (コンテキストが初期化子を呼び出す時点をすでに過ぎた後に初期化子を設定します)。

コードの任意の時点でエンティティフレームワークにイニシャライザを強制的に実行させることができますcontext.Database.Initialize(true);(パラメータは true/false で、現在の状態に関係なく初期化を強制します)。それは毎回データベースを削除して再作成します。

ただし、アプリケーションのライフサイクルのできるだけ早い段階 (コンテキストの単一のインスタンスを作成する前) にイニシャライザがセットアップされていることを確認することもできます。

于 2012-08-24T15:26:12.030 に答える
10

こちらの記事/チュートリアル(microsoft.com) では、initialCreate 移行が存在しない理由について説明しています。移行は、データベースが既に存在する場合にのみ追加されます。それ以外の場合、最初の移行は「initialCreate」になります。これは、まだ存在しないデータベースへの移行を作成しても意味がないためです... DB がないということは、ダウン移行時にロールバックするものが何もないことを意味します。

関連する段落は次のとおりです。

パッケージ マネージャー コンソールで Enable-Migrations コマンドを実行します。このコマンドにより、プロジェクトに Migrations フォルダーが追加されました。この新しいフォルダーには、次の 2 つのファイルが含まれています。

構成クラス。このクラスを使用すると、コンテキストに対して Migrations がどのように動作するかを構成できます。このチュートリアルでは、既定の構成のみを使用します。 プロジェクトには Code First コンテキストが 1 つしかないため、Enable-Migrations によって、この構成が適用されるコンテキスト タイプが自動的に入力されます。

InitialCreate 移行。この移行が生成されたのは、移行を有効にする前に、Code First でデータベースを作成していたためです。このスキャフォールディングされた移行のコードは、データベースで既に作成されているオブジェクトを表しています。この例では、BlogId 列と Name 列を持つ Blog テーブルです。ファイル名には、順序付けに役立つタイムスタンプが含まれています。

データベースがまだ作成されていない場合、この InitialCreate 移行はプロジェクトに追加されません。代わりに、Add-Migration を初めて呼び出すと、これらのテーブルを作成するコードが新しい移行に足場として組み込まれます。

于 2012-12-20T02:41:09.593 に答える
5

同じかどうかはわかりませんが、同様の問題がありました。私の問題は、接続文字列を取得するために構成ファイルの接続文字列を使用していないという事実に関連していると思います。

ソリューションのスタートアップ プロジェクトとパッケージ マネージャー コンソールのプロジェクト コンボをいじって、最初の移行を生成することができました。

また、パッケージ マネージャーが見つけられるように、dbContext クラスの名前の接続文字列があることを確認してください。

于 2012-08-30T23:36:51.977 に答える