【发布时间】:2012-04-19 13:32:26
【问题描述】:
今天我将一个旧应用程序从 EF 4.2 迁移到 EF 4.3.1。 在我的应用程序中,我使用的是 CodeFirst,但迁移后它停止工作,并且找不到原因。 为了解决任何其他可能的问题,我决定创建一个小型控制台应用程序,并使用 ADO 团队发布的数据迁移演练:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
我完全复制了博客的代码,但没有正常工作(创建数据库、创建架构和插入博客)我得到了一些错误:
- 只创建数据库,不创建表
- 我收到此错误
Conversion failed when converting datetime from character string."
所有这些都在 SQL Server 2005 express 上。
我使用 SQL Compact 尝试了相同的操作,但结果相同(但错误不同):
- 仅创建 DB(在本例中为 bin 文件夹中的 sdf 文件),但不创建表
- 我收到错误
The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]
我认为在这两种情况下,问题都在于 EF 想要作为第一次迁移进入的行:
INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion])
VALUES ('201204191321184_init', '2012-04-19T13.21.04.364', ...., '4.3.1');
显然是带有 .是错误的,至少在我的语言环境中,它应该是:
这是一个错误还是什么?之前它总是与其他日期时间一起使用。
更新 我尝试将它作为显式迁移运行,并使用 -verbose 标志集应用迁移,这就是我得到的:
PM> Update-Database -Verbose
Using NuGet project 'ConsoleApplication2'.
Using StartUp project 'ConsoleApplication2'.
Target database is: '|DataDirectory|ConsoleApplication2.ConsoleApplication1.BlogContext.sdf' (DataSource: |DataDirectory|ConsoleApplication2.ConsoleApplication1.BlogContext.sdf, Provider: System.Data.SqlServerCe.4.0, Origin: Convention).
Applying explicit migrations: [201204191356197_Initial].
Applying explicit migration: 201204191356197_Initial.
CREATE TABLE [Blogs] (
[BlogId] [int] NOT NULL IDENTITY,
[Name] [nvarchar](4000),
CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
)
CREATE TABLE [__MigrationHistory] (
[MigrationId] [nvarchar](255) NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[Model] [image] NOT NULL,
[ProductVersion] [nvarchar](32) NOT NULL,
CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId])
)
[Inserting migration history record]
System.Data.SqlServerCe.SqlCeException (0x80004005): The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.56.45.437 ]
at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, Boolean& isBaseTableCursor)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading)
at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.56.45.437 ]
更新 2 我安装了 SQL Server Profiler,并分析了那里发生的事情。 我通过查询分析器一一执行了所有语句,如前所述,失败的是迁移的插入。
INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201204231416585_InitialCreate', '2012-04-23T14.16.59.038Z', ...., '4.3.1')
当将数据时间字符串的格式从 2012-04-23T14.16.59.038Z 更改为 2012-04-23T14:16:59.038Z 时,命令通过了,所以我猜想 EF 以与我的语言环境不兼容的格式发送数据时间。
谢谢 西蒙娜
【问题讨论】:
-
嗨 Simone,db 机器的语言环境和数据库的排序规则是什么?奇怪的是,T-SQL 通过 SSMS 运行良好
-
DB 机器(我的机器)是 IT,DB 的排序规则是法语,这可能会在 SQL Express 上解释(即使 2012-04-19T13.21.04.364 应该是不变的格式)。但是 SQL Compact 在应用程序的相同上下文中运行,这应该不是问题。
-
@CodeClimber stackoverflow.com/a/9745125/417747 - 看看这个链接是否有帮助(我关于类似问题的另一篇文章,按照我的经验,这几件事应该可以帮助你深入了解,主要是关于迁移、初始化程序和可能连接字符串) - 让我知道,我会发布更全面的答案。
-
日期是由迁移生成的吗?我相信有效的格式是 '2012-04-19T13:21:04.364' 而不是 '2012-04-19T13.21.04.364' (冒号与点将小时与分钟分开,将分钟与秒分开)
-
我一直试图在我的本地机器上重新创建这个错误,但没有成功。您是否有机会向我们发送一个重现错误的小解决方案?如果是这样,请使用我们团队博客上的Email Blog Author 链接告知我们。
标签: entity-framework-4 ef-code-first sql-server-ce entity-framework-migrations