Entity framework 实体框架5需要来自MigrationHistory表的CreatedOn列
我正在将MVC 3应用程序从EF 4.3迁移到EF 5。我注意到EF5需要_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
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