8

오늘 이전 응용 프로그램을 EF 4.2에서 EF 4.3.1로 마이그레이션했습니다. 내 응용 프로그램에서 CodeFirst를 사용했지만 마이그레이션 후 작동이 멈췄으며 그 이유를 찾을 수 없습니다. 다른 가능한 문제를 지우려면 내가 작은 콘솔 응용 프로그램을 만들기로 결정하고 난 ADO 팀에 의해 발표 된 데이터 마이그레이션을 통해 워크 사용 :Entity Framework 4.3.1 코드 첫 번째 : 데이터베이스가 생성되었지만 테이블이 없습니다.

http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

내가 블로그 정확하게 코드를 복사, 대신 제대로 작동합니다 (DB를 생성, 스키마를 만들고, 블로그를 삽입)의 나는 몇 가지 오류 얻을 : 오직 DB가 생성됩니다

  • ,하지만 테이블 난이 오류를 얻을
  • Conversion failed when converting datetime from character string. "

모든 내용은 SQL Server 2005 Express에 있습니다.

나는 같은 사용하여 SQL 컴팩트하지만 동일한 결과 (다른 오류 THO) 시도 : 단지 DB (이 경우 bin 폴더에있는 SDF 파일)을 생성

  • ,하지만 테이블을
  • INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) 
    VALUES ('201204191321184_init', '2012-04-19T13.21.04.364', ...., '4.3.1'); 
    
    :
  • 나는 The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]

내가 문제가 EF 먼저 마이그레이션으로 입력하고자하는 라인에있다 두 경우 모두 생각하는 오류

분명히. 잘못된 것입니다. 적어도 로케일에서는 다음과 같아야합니다.

이 버그는 무엇입니까? 그것은 항상 다른 datetime과 함께 작업했습니다.

UPDATE 내가 명시 적으로 마이그레이션로 실행하고 -verbose 플래그가 설정 마이그레이션을 적용하고, 여기에 내가 무엇을 얻을 시도 : 나는 SQL Server를 설치 한 2

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 ] 

업데이트 프로파일 러 (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.038Z2012-04-23T14.16.59.038Z에서 datatime 문자열의 형식을 변경

는 명령을 통해 갔다, 그래서 어떻게 든 EF 내 로케일와 호환되지 않습니다 형식으로 datatime을 보내는 것 같아요.

이가 마이그레이션 코드의 버그되었으며, ADO.NET 팀에 당신 시몬

+0

안녕 시몬의 올바른 문화를 지정하여 그것을 해결, 무엇이입니다 db 머신의 로케일과 데이터베이스의 데이터 정렬? 이상하게도 T-SQL은 –

+0

DB 컴퓨터 (내 컴퓨터)가 IT 일뿐, DB의 데이터 정렬은 프랑스어입니다. SQL Express에서 설명 할 수도 있습니다 (2012-04-19T13.21.04.364가 불변의 포맷). 그러나 SQL Compact는 문제가되어서는 안되는 앱 컨텍스트에서 실행됩니다. – CodeClimber

+0

@CodeClimber http://stackoverflow.com/a/9745125/417747 -이 링크가 도움이되는지 확인하십시오. 유사한 문제에 관한 제 1 기 게시물, 그 대부분이 마이그레이션과 관련된 내 경험에 따르면, 이니셜 라이저 및 연결 문자열) - 알려 주시면보다 철저한 답변을 게시하겠습니다. – NSGaga

답변

7

감사를드립니다. 그들은 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에서 구성을 지정해야합니다. HTH

0

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

나는 새로운 프로젝트와 같은 문제를 겪고, 내 경우에는 내가 내 Web.config의

<globalization enableClientBasedCulture="false" culture="en-US" /> 
관련 문제