8

Hôm nay tôi đã di chuyển một ứng dụng cũ từ EF 4.2 sang EF 4.3.1. Trong ứng dụng của tôi, tôi đã sử dụng CodeFirst, nhưng sau khi di chuyển nó ngừng hoạt động và không thể tìm ra lý do cho điều đó. Để xóa tất cả các vấn đề khác có thể, tôi quyết định tạo ra một ứng dụng giao diện điều khiển nhỏ và tôi đã sử dụng di chuyển dữ liệu đi qua được công bố bởi nhóm ADO:Khuôn khổ thực thể 4.3.1 Mã đầu tiên: cơ sở dữ liệu được tạo nhưng bảng không phải là

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

tôi sao chép chính xác mã của blog, nhưng thay vào đó làm việc một cách chính xác (tạo DB, tạo ra các lược đồ, và chèn blog) tôi nhận được một số lỗi:

  • chỉ DB được tạo ra, nhưng không có bảng
  • tôi nhận được lỗi này Conversion failed when converting datetime from character string. "

Tất cả điều này là trên SQL Server 2005 express.

tôi đã cố gắng cùng sử dụng SQL nhỏ gọn, nhưng kết quả tương tự (tho lỗi khác nhau):

  • chỉ DB được tạo ra (trong trường hợp này là một tập tin sdf trong thư mục bin), nhưng không có bảng
  • tôi nhận được lỗi The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]

tôi nghĩ rằng trong cả hai trường hợp vấn đề nằm ở dòng EF muốn nhập như di cư đầu tiên:

INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) 
VALUES ('201204191321184_init', '2012-04-19T13.21.04.364', ...., '4.3.1'); 

Dường như định dạng với. là sai, ít nhất là trong miền địa phương của tôi, nó phải là:

Đây có phải là lỗi hay không? Nó luôn luôn làm việc với datetime khác trước đây.

CẬP NHẬT Tôi đã cố gắng chạy nó như di cư rõ ràng, và áp dụng sự di cư với cờ -verbose, và đây là những gì tôi nhận được:

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 ] 

Cập nhật 2 Tôi đã cài đặt SQL Server Profiler, và profiled những gì đang xảy ra ở đó. Tôi đã thực hiện tất cả các câu lệnh từng cái một thông qua bộ phân tích truy vấn và câu lệnh không thành công, như đã nêu ở trên, việc chèn di chuyển.

INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201204231416585_InitialCreate', '2012-04-23T14.16.59.038Z', ...., '4.3.1') 

Khi thay đổi định dạng của chuỗi datatime 2012-04-23T14.16.59.038Z-2012-04-23T14:16:59.038Z lệnh đã trải qua, vì vậy tôi đoán bằng cách nào đó EF được gửi datatime ở định dạng không tương thích với ngôn của tôi.

Cảm ơn bạn Simone

+0

Hi Simone, những gì là locale của máy db và collation của cơ sở dữ liệu? Odd rằng T-SQL chạy tốt thông qua SSMS mặc dù –

+0

máy DB (máy của tôi) là nó-IT, collation của DB là tiếng Pháp, có thể giải thích về SQL Express (ngay cả khi 2012-04-19T13.21.04.364 nên là định dạng bất biến). Nhưng SQL Compact chạy trong cùng một bối cảnh của ứng dụng, điều đó không phải là vấn đề. – CodeClimber

+0

@CodeClimber http://stackoverflow.com/a/9745125/417747 - xem liệu liên kết này có giúp ích cho bạn hay không, theo những điều sau đây sẽ giúp bạn có được thorugh, theo kinh nghiệm của tôi chủ yếu là về di chuyển, initializers và chuỗi kết nối có thể) - hãy cho tôi biết và tôi sẽ đăng câu trả lời kỹ lưỡng hơn. – NSGaga

Trả lời

7

Nhờ Đội ADO.NET, đây là một lỗi trong mã Migration. Rõ ràng họ quên chỉ định InvariantCulture khi họ tạo mã cho trường DateTime, do đó nó hoạt động trên miền địa phương EN, nhưng không hoạt động ở các ngôn ngữ khác.

Để khắc phục vấn đề này, chờ một sửa chữa chính thức, bạn nên xác định một SqlGenerator tùy chỉnh đó sẽ ghi đè các Generate(DateTime defaultValue) phương pháp:

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

Và sau đó chỉ định SqlGenerator mới trong lớp Cấu hình:

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

Nếu bạn muốn sử dụng nó chỉ trong di chuyển thủ công là đủ, nếu bạn chỉ cần CodeFirst, bạn phải chỉ định cấu hình trong mã khởi động ứng dụng hoặc trong DbContext.

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

HTH

0

tôi đã cùng một vấn đề với một dự án hoàn toàn mới, trong trường hợp của tôi, tôi giải quyết nó bằng cách xác định văn hóa ngay trong web.config của tôi

<globalization enableClientBasedCulture="false" culture="en-US" /> 
Các vấn đề liên quan