【问题标题】:Entity Framework 5 expects CreatedOn column from MigrationHistory tableEntity Framework 5 需要 MigrationHistory 表中的 CreatedOn 列
【发布时间】:2012-08-16 00:10:52
【问题描述】:

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

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

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

201203111201542_MigrationName

【问题讨论】:

标签: entity-framework entity-framework-5


【解决方案1】:

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

【讨论】:

  • 我看不出这是如何回答原始问题的——“我该如何解决...”
  • @SpongeMan:我遇到了这个异常,但事实证明我不小心将 Visual Studio 设置为中断所有异常,而不仅仅是未处理的异常。因此,虽然 Andrew 没有明确表示,但解决方案是关闭第一次机会异常的中断。 Debug->Exceptions,然后取消选中 Throw 列。
【解决方案2】:

正如 Filip Cornelissen 所说,这是 MiniProfiler.EF 和 Entity Framework 5.0 之间的东西。

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

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

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

你走吧!

【讨论】:

  • 会的。但据我所知,EF 不会抛出(未处理的)SQL 异常。因此,在您的 EF 支持的项目中忽略这些异常是非常安全的。
【解决方案3】:

根据 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()

【讨论】:

  • 是的,但它只是暂时的。 CreatedOn 列将再次被删除!只是时间问题。
【解决方案4】:

当您从 EF4.* 升级到 EF 5.0 时,在启用迁移的情况下,这似乎是 EF Code first 中的事情。并与 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());
        ");
    }
}

【讨论】:

  • AutoDetectChanges = false 实际上并不能解决问题,它也会发生在“手动”迁移中。但是,当然,其他两个解决方案是正确的。谢谢。
  • 嗯,我以为我测试正确:p 谢谢你的信息
  • 添加 CreatedOn 字段也不起作用,因为下一次迁移会立即删除它并重新开始。
  • 也许您可以在种子方法中添加一个 Alter 表。
【解决方案5】:

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

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

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

PM> Install-Package MiniProfilerContrib.EFMigrationsFix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多