2012-02-14 18 views
2

プロジェクトをEntity Framework 4.3にアップグレードし、プロジェクトの移行を有効にしました。EF 4.3でUpdate-Databaseを実行しているときにエラーが発生しました

更新-Databaseコマンドを実行している場合しかし、私はこのエラーを取得:

は、ターゲット・データベースが以前のEF 4.3よりもコードファーストのバージョンで作成されたため、次の移行を足場できないと移行履歴が含まれていません表。このデータベースに対して移行を開始するには、現在のモデルがターゲットデータベースと互換性があることを確認し、移行プロセスを実行します。 (Visual Studioでは、パッケージマネージャコンソールのUpdate-Databaseコマンドを使用して、移行プロセスを実行できます)。

基本的には、私にエラーを返す同じコマンド(Update-Database)を実行するように指示しています。

アイデア?


ないまさに「楽しい」の方法は、それを行うには、私はアプリが「__MigrationHistory」と呼ばれるシステムテーブルを作成し、新しいデータベースを作成してみましょう。私はその後、次のスクリプトを実行して、古いデータベースにそのテーブルを作成しました。また、新しいデータベースに存在する1つの行を古いデータベースにコピーするためのスクリプトも作成しました。

マイクロソフトまたはコミュニティの誰かがこれを行うより効率的な方法を知っている場合は、ここに投稿してください!


SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[__MigrationHistory](
    [MigrationId] [nvarchar](255) NOT NULL, 
    [CreatedOn] [datetime] NOT NULL, 
    [Model] [varbinary](max) NOT NULL, 
    [ProductVersion] [nvarchar](32) NOT NULL, 
CONSTRAINT [PK___MigrationHistory] PRIMARY KEY CLUSTERED 
(
    [MigrationId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

答えて

3

あなたがEnable-Migrationsを実行したときに、スクリプトがあなたDbContextクラスが別のプロジェクトで定義されている場合、あなたのモデルがデータベースに不整合、またはされた場合は特に、最初の移行を作成していないことがあります。

既存の4.3より前のデータベースに移行を追加する「正しい方法」は何か分かりませんが、最も簡単な方法はデータベースをダンプすることです。テーブルをドロップしてください。

Migrationsフォルダの設定ファイルのコンテキストタイプが正しいことを確認してから、Add-Migration Initialを確認してください。あなたの現在のモデルを表す大きなクラスが構築されます。

今すぐUpdate-Databaseが不満なく実行されます。


あなたはデシベルで気にデータを持っている場合、あなたはカンニングと移行プロセスは、データベースの以前のバックアップを作成します__MigrationHistoryテーブルを追加することができるかもしれません。 EdmMetadataを削除して、移行を賢明にするべきではありません。

既存のEFコードファーストデータベースにマイグレーションを追加する方法を実際に知っている人には、よりスムーズなアップグレード手順が必要ですか?

+0

ありがとうございます!私は使用する必要のあるデータベースに多くのデータがあるので、_MigrationHistoryテーブルを作成する道を行くと思います。 –

+2

IIも同様の問題を抱えていました。私もデータを保持する必要がありました。しかし、モデルを編集して列を追加しようとすると、「Add-migration newcolumns」が作成されたが、作成された移行ではすべてを削除してやり直したかった。その解決策は、何かを編集する前に最初のマイグレーションを追加して、空のアップ/ダウンメソッドを持つマイグレーションクラスを作成することでした。その後、私のモデルを編集して別のAdd-Migrationを実行しました。これは、必要な変更だけで新しい移行クラスを作成しました。何も落とさずに。 – Moulde

0

私はちょうど私が私がこのblog postで答えを見つけることがすでに4.3だったが....

ませんでした「と思った」データベースにこのに走りました。

基本的な手順は次のとおりです。

  1. モデルに変更を加えないでください。本当にそうしないでください!
  2. 初期移行を追加します。
  3. データベースを更新します(すべて)。

これで正常に仕事をすることができます。

はここで核心です:

は、モデルを変更しないでください。

ご存知の方は、それらを取り戻す必要があります。 Ugggg。私はちょうど私の変更をコメントアウトしました。幸運なことに、私にとって、変更はまだかなり小さかった。もちろん、とにかく右の小さな塊で物事をしています。 :-)

初期移行を追加します。

Add-Migration "InitialModel" -IgnoreChanges 

がアップスクリプトで次の行を追加します。

public override void Up()  
{   
    Sql("DROP TABLE EdmMetadata");  
} 

ドロップテーブルを追加する必要はありませんが、4.3とオンそうEdmMetadataを使用していない、かもしれないとしても。

更新データベース(それらのすべて)

Update-Database 

は、あなたがこのデータベースの他のサーバーを持っていますか?テスト、ステージング、プロダクション?これらのすべてについても、この最後のステップを必ず実行してください。これを他のサーバーにも実行する前に、すべての移行作業が完了するまで待つことができます。

ここで、通常どおり続行します。変更を行い、通常の手順Add-Migration & Update-Databaseの移行手順に従ってください。

0

質疑応答ありがとうございます。私は以下のことをしました(上記のアドバイスの構成)。

  1. コメントアウトし、現在のデータと比較して行われたすべての変更を(私は追加のテーブルを削除するために必要な):データとコードファーストモデルと事前EF 4.3から移行する方法

  2. Backupデータベース
  3. 削除テーブルEdmMetadata
  4. 実行Add-Migration "InitialModel"
  5. ドロップ上記のスクリプトを実行Update-database
  6. が持つ__MigrationHistoryのためのスクリプトを生成し__MigrationHistoryテーブル
  7. を除くすべてのテーブルをテーブル__MigrationHistoryを追加新たに追加されたデータ。そこにはDrop table EdmMetadataを追加してください。
  8. データベースを復元し、このスクリプトを実行します。
  9. コードの変更を元に戻します。
  10. 実行Add-Migration YOURNAMEFORNEWCHANGES
  11. 実行Update-Database

そして、私は助けEF 6.希望に更新されたデータと古いデータベースを持っています!

関連する問題