8

(localdb)\v11.0 (Vstudio 2012) で EF5 を使用してコード ファーストの移行を使用しており、これまでのところすべてがうまく機能しています。

ただし、今日、いくつかのテーブルにいくつかのインデックスを作成する必要があり、問題が発生しました。

まず、PMでこれを行いました:

PM> add-migration AddIdxToOutage
Scaffolding migration 'AddIdxToOutage'.

スキャフォールディングされた移行のコードを次のように変更しました。

public override void Up()
        {
            Sql(@"CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages]
(
    [WtgId] ASC,
    [StartDateTime] ASC,
    [EndDateTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]");
        }

データベースを更新したところ、結果は次のようになりました。

PM> update-database -startupprojectname D3A.Data -force -verbose
Using StartUp project 'D3A.Data'.
Using NuGet project 'D3A.Data'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201310301258520_AddIdxToOutage].
Applying code-based migration: 201310301258520_AddIdxToOutage.
CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages]
(
    [WtgId] ASC,
    [StartDateTime] ASC,
    [EndDateTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
[Inserting migration history record]
Running Seed method.

idx がテーブルの上に作成され、誰もが満足しました。

ただし、次のインデックスを作成したときに問題が発生しました。として空の移行タスクを作成しました

PM> add-migration AddIdxToState
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301258520_AddIdxToOutage]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

私のフランス語を許してください - でも WT*?

これを回避する方法はないようです。最初の idx を追加する前の移行手順に戻り、idx を再度追加すると、同じことが再び起こります。

ここで何が欠けているか教えてもらえますか? 私は何を間違っていますか?

編集:

最初は、データベース/localdb に対して生の SQL を実行することが問題だと思っていましたが、最初の add-migration の後ですべてが停止したようです。

データベースに新しいテーブルを追加しました。これは PM コンソールからの標準出力結果です。

PM> add-migration AddMyLoggerTable
Scaffolding migration 'AddMyLoggerTable'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201310301419063_AddMyLoggerTable' again.
PM> update-database -startupproject DongEnergy.D3A.Data -verbose
Using StartUp project 'D3A.Data'.
Using NuGet project 'D3A.Data'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201310301419063_AddMyLoggerTable].
Applying code-based migration: 201310301419063_AddMyLoggerTable.
CREATE TABLE [dbo].[MyLoggerTable] (
    [id] [int] NOT NULL,
    [functionId] [int],
    [elapsedTime] [bigint],
    [noOfRecords] [int],
    [dateCreated] [datetime] DEFAULT getDate()
)
[Inserting migration history record]
Running Seed method.
PM> add-migration AddMyLoggerTableFunction
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301419063_AddMyLoggerTable]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

新しい空の移行タスクを追加し、CreateTable メソッドを使用して、データベースで正常に更新する方法に注目してください。しかし、新しい移行ステップを追加すると、migrationhistory とデータベース オブジェクトの両方が更新されているにもかかわらず、データベースに「コミット」されたばかりのタスクがまだ「保留中」であると不平を言います。

4

3 に答える 3

2

Configuration.cs ファイルの ContextKey 値を変更した後、 「次の明示的な移行が保留中であるため、明示的な移行を生成できません...」というエラーが発生しました。私はそれを元に戻し、問題はなくなりました。

于 2015-05-22T14:55:30.600 に答える