2

プロジェクトを Entity Framework 4.3 にアップグレードし、プロジェクトで移行を有効にしました。

ただし、Update-Database コマンドを実行すると、次のエラーが発生します。

ターゲット データベースが EF 4.3 より前のバージョンの Code First で作成されており、移行履歴テーブルが含まれていないため、次の移行をスキャフォールディングできません。このデータベースに対して移行の使用を開始するには、現在のモデルがターゲット データベースと互換性があることを確認し、移行の更新プロセスを実行します。(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
4

3 に答える 3

3

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

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

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

Update-Databaseこれで文句なしに実行されます。


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

移行が既存のEFCodeFirstデータベースにどのように追加されることを意図していたかを実際に知っている人が、よりスムーズなアップグレード手順を実行できることを願っています。

于 2012-02-14T16:24:09.637 に答える
1

すでに 4.3 だと「思っていた」データベースでこれに遭遇しましたが、そうではありませんでした....

このブログ投稿で答えを見つけました。

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

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

これで、通常のビジネスに取り掛かることができます。

要点は次のとおりです。

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

持っている場合は、それらを取り消す必要があります。うぐぐ。変更をコメントアウトしただけです。幸いなことに、私にとっては、変更はまだかなり小さいものでした. もちろん、とにかく小さな塊で物事をやっています。:-)

初期移行を追加します。

Add-Migration "InitialModel" -IgnoreChanges

up スクリプトに以下を追加します。

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

ドロップ テーブルを追加する必要はありませんが、4.3 以降では EdmMetadata を使用しないため、追加することもできます。

データベースを更新する (すべて)

Update-Database

このデータベース用の他のサーバーはありますか? テスト、ステージング、本番? それらすべてに対しても、必ずこの最後の手順を実行してください。他のサーバーに対してもこれを行う前に、すべての移行作業が完了するまで待つことができます。

では、通常通り続けてください。変更を行い、通常の移行手順に従いますAdd-MigrationUpdate-Database

于 2013-10-01T22:58:37.233 に答える
1

質問と回答ありがとうございます。私は次のことを行いました(上記のアドバイスの構成)。

データと Code First モデルを使用して EF 4.3 より前から移行する方法:

  1. 現在のデータと比較して行われたすべての変更をコメントアウトします (テーブルの追加を削除する必要がありました)。
  2. データベースのバックアップ
  3. テーブルを削除EdmMetadata
  4. __MigrationHistory上記のスクリプトでテーブルを追加します
  5. 走るAdd-Migration "InitialModel"
  6. テーブルを除くすべてのテーブルを削除し__MigrationHistoryます
  7. 走るUpdate-database
  8. __MigrationHistory新しく追加されたデータを使用してスクリプトを生成します。そこに追加しDrop table EdmMetadataます。
  9. データベースを復元し、このスクリプトを実行します。
  10. コードの変更を元に戻します。
  11. 走るAdd-Migration YOURNAMEFORNEWCHANGES
  12. 走るUpdate-Database

そして、データがEF 6に更新された古いデータベースがあります。

于 2014-01-30T14:20:36.220 に答える