我正在将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
答案 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)
在EF代码中首先启用迁移。与MiniProfiler结合使用。该表存在于系统表下的dbo._MigrationHistory中。
你尝试做一些事情:
以下是添加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