8

今天,我將舊應用程序從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,是不是我的語言環境兼容。

謝謝 西蒙娜

+0

西蒙娜嗨指定正確的文化,有什麼數據庫機器的語言環境和數據庫的排序規則?奇怪的是,T-SQL通過SSMS運行良好,儘管 – 2012-04-19 13:36:42

+0

DB機器(我的機器)是IT-IT,數據庫的排序規則是法語,可以在SQL Express上解釋(即使2012-04-19T13.21.04.364應該是不變的格式)。但是SQL Compact運行在應用程序的相同上下文中,這應該不是問題。 – CodeClimber 2012-04-19 13:46:05

+0

@CodeClimber http://stackoverflow.com/a/9745125/417747 - 看看這個鏈接是否有幫助(在我遇到類似問題的帖子後,下面這幾件事可以幫助你獲得答案,根據我的經驗,主要是圍繞遷移,初始化器和可能的連接字符串) - 讓我知道,我會發布更徹底的答案。 – NSGaga 2012-04-19 13:54:24

回答

7

由於ADO.NET團隊,這是在遷移代碼中的錯誤。 顯然,當他們爲DateTime字段生成代碼時,他們忘記指定InvariantCulture,因此它在EN語言環境中工作,但不在其他語言環境中工作。

要解決此問題,等待官方補丁,你應該指定覆蓋Generate(DateTime defaultValue)方法自定義SqlGenerator:

class FixedSqlGenerator : SqlServerMigrationSqlGenerator 
{ 
    protected override string Generate(DateTime defaultValue) 
    { 
     return "'" + defaultValue.ToString("yyyy-MM-ddTHH:mm:ss.fffK", CultureInfo.InvariantCulture) + "'"; 
    } 
} 

,然後指定在配置類新SqlGenerator:

SetSqlGenerator("System.Data.SqlClient", new FixedSqlGenerator()); 

如果您只是在手動遷移時使用它,那麼如果您只需要CodeFirst,則必須在應用程序啓動代碼或DbContext中指定配置。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogContext, Migrations.Configuration>()); 

HTH

0

我有一個全新的項目,同樣的問題,在我的情況我解決它在我的web.config

<globalization enableClientBasedCulture="false" culture="en-US" /> 
相關問題