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

CMi*_*cea 20 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]
Run Code Online (Sandbox Code Playgroud)

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

201203111201542_MigrationName
Run Code Online (Sandbox Code Playgroud)

And*_*ers 6

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

  • 我不知道这是如何回答原来的问题 - '我该如何解决......' (7认同)
  • @SpongeMan:我得到了这个异常,但事实证明我不小心让Visual Studio设置为打破所有异常,而不仅仅是未处理的异常.因此,虽然安德鲁没有明确说明,但决议是关闭破坏第一次机会的例外.Debug-> Exceptions,然后取消选中Thrown列. (5认同)

s.m*_*jer 6

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

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

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

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

你走吧!

  • 是的,它会的.但据我所知,EF不会抛出(未处理)SQL异常.因此,忽略EF驱动项目中的这些异常是非常安全的. (2认同)

Fil*_*sen 5

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

你尝试做一些事情:

  1. 您可以手动将CreatedOn(DateTime)列添加到System tables文件夹下的dbo._MigrationHistory表.
  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());
        ");
    }
}
Run Code Online (Sandbox Code Playgroud)


Yeg*_*gor 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()
Run Code Online (Sandbox Code Playgroud)

  • 是的,确实如此,但这只是暂时的。CreatedOn 列将再次删除!只是时间问题。 (5认同)