今天,我將舊應用程序從EF 4.2遷移到EF 4.3.1。 在我的應用程序中,我使用的是CodeFirst,但在遷移後它停止工作,並且找不到原因。 要清除任何其他可能出現的問題,我決定創建一個小型控制檯應用程序,我使用了數據遷移步行通過由ADO隊公佈:實體框架4.3.1代碼優先:創建數據庫但表格不是
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
我複製博客的完全代碼,而是工作正常(創建數據庫,創建模式,並插入博客)我得到了一些錯誤:
- 只有DB被創建,但沒有表
- 我得到這個錯誤
Conversion failed when converting datetime from character string.
「
所有這些都在SQL Server 2005 express上。
我嘗試同樣使用SQL精簡,但相同的結果(壽不同的錯誤):
- 只有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');
顯然與格式。是錯誤的,至少在我的語言環境中,它應該與:
這是一個錯誤還是什麼?它以前一直與其他日期時間一起工作。
UPDATE 我試圖運行它作爲明確的遷移,並與-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')
當改變DATATIME字符串從2012-04-23T14.16.59.038Z
的格式2012-04-23T14:16:59.038Z
命令經歷了,所以我想以某種方式EF被髮送格式的DATATIME,是不是我的語言環境兼容。
謝謝 西蒙娜
西蒙娜嗨指定正確的文化,有什麼數據庫機器的語言環境和數據庫的排序規則?奇怪的是,T-SQL通過SSMS運行良好,儘管 – 2012-04-19 13:36:42
DB機器(我的機器)是IT-IT,數據庫的排序規則是法語,可以在SQL Express上解釋(即使2012-04-19T13.21.04.364應該是不變的格式)。但是SQL Compact運行在應用程序的相同上下文中,這應該不是問題。 – CodeClimber 2012-04-19 13:46:05
@CodeClimber http://stackoverflow.com/a/9745125/417747 - 看看這個鏈接是否有幫助(在我遇到類似問題的帖子後,下面這幾件事可以幫助你獲得答案,根據我的經驗,主要是圍繞遷移,初始化器和可能的連接字符串) - 讓我知道,我會發布更徹底的答案。 – NSGaga 2012-04-19 13:54:24