20

我正在将 MVC 3 应用程序从 EF 4.3 迁移到 EF 5。我注意到 EF 5 需要表中的一CreatedOn列,该列__MigrationHistory不存在,因为迁移是由旧版本创建的。

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

如何在不擦除迁移历史记录的情况下解决此问题?我正在考虑一个查询来从迁移名称中推断列的值,格式如下:

201203111201542_MigrationName
4

5 回答 5

6

不再需要 CreatedOn 列。我们尝试从中查询以确定是否需要删除它。即您正在从 4.3 升级到 5。

于 2012-08-22T16:48:07.777 回答
6

就像 Filip Cornelissen 说的,这是 MiniProfiler.EF 和 Entity Framework 5.0 之间的东西。

解决/隐藏问题实际上比您想象的要容易。这只是一个“调试问题”,因为您将得到的错误仅在实例化期间发生(检查新迁移),并且错误是“SQL Unhandeld Exception”。

所以,解决这个问题很容易:

在 Visual Studio 中转到“调试”选项卡。点击“例外”项。在新对话框中,打开树“公共语言运行时异常”。在“System.Data.SqlClient”下,取消选中“System.Data.SqlClient.SqlException”后的两个复选框。添加它,如果它不存在。

走吧!

于 2012-11-18T18:10:26.980 回答
5

当您从 EF4.* 升级到 EF 5.0 时,在启用迁移的情况下,这似乎是 EF 代码中的一件事。并与 MiniProfiler 结合使用。该表存在于系统表下的 dbo._MigrationHistory 中。

你尝试做一些事情:

  1. 您可以手动将 CreatedOn (DateTime) 列添加到系统表文件夹下的 dbo._MigrationHistory 表中。
  2. 您可以通过设置 Configuration.AutoDetectChangesEnabled = false 来停止检测更改;
  3. 注释此行 MiniProfilerEF.Initialize(),禁用 EF 分析。

这是添加 CreatedOn 列的种子方法示例。每次初始化上下文时都会删除此列。种子方法在上下文的配置类中。

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

这是我正在使用的解决方法。就个人而言,我可以按两次绿色箭头(开始调试,然后继续),但如果您真的希望它停止中断,请尝试此构建后事件,它将删除 MiniProfiler PDB:

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

更新:如果这对您来说工作量太大,我创建了一个NuGet 包

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