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)
不再需要CreatedOn列.我们尝试从中进行查询,以确定是否需要删除它.即您正在从4.3升级到5.
就像Filip Cornelissen所说,这是MiniProfiler.EF和Entity Framework 5.0之间的事情.
解决/隐藏问题实际上比您想象的要容易.它只是一个"调试问题",因为您将获得的错误只发生在实例化期间(检查新的迁移),并且错误是"SQL Unhandeld异常".
所以,解决这个问题很容易:
进入Visual Studio到"DEBUG"选项卡.点击"例外"项目.在新对话框中,打开树"Common Language Runtime Exceptions".在"System.Data.SqlClient"下,取消选中"System.Data.SqlClient.SqlException"之后的两个复选框.添加它,如果它不存在.
你走吧!
当您从EF4.*升级到EF 5.0时,首先启用迁移,这似乎是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());
");
}
}
Run Code Online (Sandbox Code Playgroud)
根据 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)
归档时间: |
|
查看次数: |
5816 次 |
最近记录: |