实体框架5期望来自MigrationHistory表的CreatedOn列

时间:2012-08-16 00:10:52

标签: entity-framework entity-framework-5

我正在将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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

就像Filip Cornelissen所说,这是MiniProfiler.EF和Entity Framework 5.0之间的事情。

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

因此,解决这个问题很容易:

将Visual Studio转到“DEBUG”选项卡。点击“例外”项目。在新对话框中,打开树“Common Language Runtime Exceptions”。在“System.Data.SqlClient”下,取消选中“System.Data.SqlClient.SqlException”之后的两个复选框。添加它,如果它不存在。

然后离开!

答案 2 :(得分:5)

当从EF4。*升级到EF 5.0时,

在EF代码中首先启用迁移。与MiniProfiler结合使用。该表存在于系统表下的dbo._MigrationHistory中。

你尝试做一些事情:

  1. 您可以手动将CreatedOn(DateTime)列添加到System tables文件夹下的dbo._MigrationHistory表。
  2. 您可以通过设置Configuration.AutoDetectChangesEnabled = false;
  3. 停止检测更改
  4. 注释此行MiniProfilerEF.Initialize(),禁用EF分析。
  5. 以下是添加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());
            ");
        }
    }
    

答案 3 :(得分:4)

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

答案 4 :(得分:3)

这是我正在使用的解决方法。就个人而言,我按两次绿色箭头就可以了(开始调试然后继续),但是如果你真的希望它停止破坏,试试这个Post Build Event会删除MiniProfiler PDB:

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

更新:如果您的工作太多,我创建了NuGet package

PM> Install-Package MiniProfilerContrib.EFMigrationsFix