Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架5需要来自MigrationHistory表的CreatedOn列_Entity Framework_Entity Framework 5 - Fatal编程技术网

Entity framework 实体框架5需要来自MigrationHistory表的CreatedOn列

Entity framework 实体框架5需要来自MigrationHistory表的CreatedOn列,entity-framework,entity-framework-5,Entity Framework,Entity Framework 5,我正在将MVC 3应用程序从EF 4.3迁移到EF 5。我注意到EF5需要_MigrationHistory表中的CreatedOn列,该列不存在,因为迁移是由旧版本创建的 SELECT TOP (1) [c].[CreatedOn] AS [CreatedOn] FROM [dbo].[__MigrationHistory] AS [c] 如何在不删除迁移历史记录的情况下解决此问题?我正在考虑一个查询,从迁移名称推断列的值,其格式如下: 201203111201542_MigrationN

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

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn]
FROM [dbo].[__MigrationHistory] AS [c]
如何在不删除迁移历史记录的情况下解决此问题?我正在考虑一个查询,从迁移名称推断列的值,其格式如下:

201203111201542_MigrationName

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

当您从EF4.*升级到EF 5.0时,在EF代码中似乎首先启用了迁移。与MiniProfiler结合使用。该表存在于系统表下的dbo.\u MigrationHistory中

你试着做几件事:

您可以手动将CreatedOn DateTime列添加到System tables文件夹下的dbo.\u MigrationHistory表中。 您可以通过设置Configuration停止检测更改。AutoDetectChangesEnabled=false; 注释此行MiniProfilerEF.Initialize,禁用EF评测。 下面是添加CreatedOn列的seed方法的示例。每次初始化上下文时,此列都将被删除。seed方法位于上下文的配置类中

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());
        ");
    }
}

正如Filip Cornelissen所说,它是MiniProfiler.EF和Entity Framework 5.0之间的事情

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

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

在VisualStudio中转到调试选项卡。点击例外项。在新建对话框中,打开公共语言运行时异常树。在System.Data.SqlClient下,取消选中System.Data.SqlClient.SqlException之后的两个复选框。如果没有,就加上


走开

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

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

del "$(TargetDir)MiniProfiler.pdb" /q /s
更新:如果这对你来说太多了,我创建了一个:


这似乎与MiniProfiler存在冲突:AutoDetectChanges=false实际上并不能解决问题,手动迁移也会出现这种情况。但是,当然,其他两种解决方案是正确的。谢谢。嗯,我想我测试正确了:p谢谢你提供的信息添加CreatedOn字段也不起作用,因为下一次迁移会立即删除它,然后重新开始。也许你可以在种子方法中添加一个Alter表。是的。但据我所知,EF不会抛出未处理的SQL异常。因此,在EF支持的项目中忽略这些异常是非常安全的。我看不出这如何回答最初的问题——“我如何解决…”@SpongeMan:我收到了这个异常,但结果是我意外地离开了Visual Studio设置,以破坏所有异常,而不仅仅是未处理的异常。因此,虽然安德鲁没有明确表示,但决议是关闭“第一次机会”例外的破坏。Debug->Exceptions,然后取消检查抛出的列。是的,确实如此,但这只是暂时的。CreatedOn列将再次被删除!只是时间问题。
PM> Install-Package MiniProfilerContrib.EFMigrationsFix