2016-04-19 24 views
0

すべてのデータベースオブジェクトの定義を含むDBContextオブジェクトがあります。アプリケーションを初めて実行したときに、データベースが作成されました。これは現在生産中です。コードの最初の移行で既存のデータベースが見つかりません

私はDEVでモデルの変更を行う必要がありましたので、リリース時に必要なスキーマの変更を行うSQLスクリプトを生成するためにコードファーストマイグレーションを使用する必要があります。

私が理解しているように、add-migrationコマンドで新しい移行を追加することができました。既存のデータベースとモデル定義を比較し、データベースを更新できるスクリプトを生成します。しかし、私がadd-migrationコマンドを実行すると、単に新しいオブジェクトではなく、完全なデータベース作成であるマイグレーションが生成されます。

私のデータベースオブジェクトは別のクラスライブラリにあり、私はパッケージマネージャコンソールを開き、デフォルトのプロジェクトを自分のDBクラスライブラリに選択しました。私は

internal sealed class Configuration : DbMigrationsConfiguration<Centrica.EMT.Database.Context.EmtDataContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 
      ContextKey = "Centrica.EMT.Database.Context.EmtDataContext"; 
     } 

を持っており、そのクラスライブラリのapp.configをして、私は

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <connectionStrings> 
    <add name="Centrica.EMT.Database.Context.EMTDataContext" connectionString="Initial Catalog=EMTProd;Data Source=WYCVWWEBD016\COMPUTECLUSTER;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

を持って、まだそのデータベースを見つけるように見えると、更新を生成しません

の下Configuration.cs新しい移行を作成するときには、新しい完全データベース作成スクリプトを作成するだけです。

更新スクリプトを作成できませんでしたか?既存の移行を最初にベースラインとして実行する必要がありましたか?既存のデータベースを見つける方法を間違って設定しましたか?

更新

public class EmtDataContext : DbContext 
    { 
     public EmtDataContext() 
     { 
      //todoSystem.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<EmtDataContext>()); 
      var objectContextAdapter = this as IObjectContextAdapter; 
      var objectContext = objectContextAdapter.ObjectContext; 
      objectContext.CommandTimeout = Database.Connection.ConnectionTimeout; 
     } 
+0

ここでは少し誤解があると思います。最初に移行を有効にすると、最初の移行スクリプトは実際にはテーブル作成でいっぱいです。 後で何かを修正して追加マイグレーションを実行した後でなければ、デルタを説明する別のマイグレーション・スクリプトがあります。私は同様のセットアップがあり、実際にはCreateTable()の完全なです _InitialCreate.csというファイルがあります –

+0

ああ私が参照してください。私はアプリケーションを実行し、InitializerをCreateDatabaseIfNotExistsに設定しました。私は既存のものを作成しなかったので、今私は移行を使用することができますか? – NZJames

+0

はい。 MigrateDatabaseToLatestVersionを使用することができます。これは、本番環境で実行する必要があります –

答えて

0

移行は、スクリプトを決定するためにデータベースを見ていない - 彼らは最後のマイグレーションを見て、差分を行います。以前の移行がない場合は、データベース全体がスクリプト化されます。これを回避する方法は、"add-migration Baseline -IgnoreChanges"を実行して、コードが生成されずにスナップショットを更新するだけです。それ以降のすべての移行が新しいオブジェクトになります。 EFがデータベース内で探すのは、マイグレーションが適用されているかどうかを確認するための__MigrationHistoryテーブルだけです。

1)お使いの機種変更前のベースラインを確立します:

  • をお使いのモデルの変更とロールを特定

    私はそれを理解したよう

    あなたは選択肢のカップルを持っているので、あなたのDEVは先PRODの今それらを戻す。

  • 追加マイグレーションベースライン -IgnoreChanges //これにより、現在の状態のスナップショットが作成されます。
  • update-database // __MigrationHistoryを追加してレコードを挿入します。
  • モデルの変更を再度適用すると、マイグレーションの追加は に変更のみが含まれるようになります。

2)すべてのオブジェクトをスクリプトする追加マイグレーションを実行します。すでに存在するオブジェクトを にコメントして残りをPRODに適用することができます。

は、生産については、あなたがPRODデータベースに対してマイグレーションを実行する必要があるかどうかについての混合の意見を取得します

https://msdn.microsoft.com/en-US/data/dn481501を参照してください。私たちのDBAはこれを拒否したので、単にスクリプトを生成するだけです。 http://cpratt.co/migrating-production-database-with-entity-framework-code-first/#at_pco=smlwn-1.0&at_si=54ad5c7b61c48943&at_ab=per-12&at_pos=0&at_tot=1

関連する問題