20

MVC 3 アプリケーションを EF 4.3 から EF 5 に移行しています。移行が古いバージョンで作成されたため、 EF 5CreatedOnではテーブルに列が必要であることに気付きました。__MigrationHistory

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn]
FROM [dbo].[__MigrationHistory] AS [c]

移行履歴を消去せずにこの問題を解決するにはどうすればよいですか? 次の形式の移行名から列の値を推測するクエリを考えています。

201203111201542_MigrationName
4

5 に答える 5

6

Filip Cornelissen が言ったように、これは MiniProfiler.EF と Entity Framework 5.0 の間の問題です。

問題を解決/非表示にすることは、実際には思ったより簡単です。発生するエラーはインスタンス化期間中 (新しい移行のチェック中) にのみ発生し、エラーは「SQL Unhandeld Exception」であるため、これは「デバッグの問題」にすぎません。

したがって、この問題を解決するのは簡単です。

Visual Studio の [DEBUG] タブに移動します。「例外」項目をクリックします。新しいダイアログで、「共通言語ランタイム例外」ツリーを開きます。「System.Data.SqlClient」の下で、「System.Data.SqlClient.SqlException」の後の両方のチェックボックスをオフにします。存在しない場合は追加します。

そして、行きましょう!

于 2012-11-18T18:10:26.980 に答える
6

CreatedOn 列は不要になりました。ドロップする必要があるかどうかを判断するために、クエリを実行しようとします。つまり、4.3 から 5 にアップグレードしています。

于 2012-08-22T16:48:07.777 に答える
5

EF4.* から EF 5.0. そして、MiniProfiler との組み合わせです。テーブルは、システム テーブルの下の dbo._MigrationHistory に存在していました。

あなたはいくつかのことを試みます:

  1. システム テーブル フォルダーの下の dbo._MigrationHistory テーブルに CreatedOn (DateTime) 列を手動で追加できます。
  2. Configuration.AutoDetectChangesEnabled = false; を設定すると、変更の検出を停止できます。
  3. この行 MiniProfilerEF.Initialize() をコメント化し、EF プロファイリングを無効にします。

CreatedOn 列を追加するシード メソッドの例を次に示します。この列は、コンテキストが初期化されるたびに削除されます。シード メソッドは、コンテキストの Configuration クラスにあります。

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    protected override void Seed(MyContext context)
    {
        //  This method will be called after migrating to the latest version.

        // Hide error Invalid column name 'CreatedOn' from mini profiler.
        context.Database.ExecuteSqlCommand(
            @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn')
                ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME());
        ");
    }
}
于 2012-11-13T13:53:34.110 に答える
5

Filip Cornelissenの回答によると、次のスクリプトはこの問題を修正します

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE()
GO
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE()
于 2012-12-11T23:48:55.923 に答える
3

これが私が使用している回避策です。個人的には、緑色の矢印を 2 回押しても問題ありません (デバッグを開始してから続行します)。しかし、どうしても壊れないようにしたい場合は、MiniProfiler PDB を削除するビルド後のイベントを試してください。

del "$(TargetDir)MiniProfiler.pdb" /q /s

更新:それが面倒な場合は、NuGet パッケージを作成しました:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix
于 2014-09-15T17:53:31.357 に答える