Entity Framework 4.3.1 Code First: база данных создана, но таблицы нет

Сегодня я мигрировал старое приложение с EF 4.2 на EF 4.3.1. В моем приложении я использовал CodeFirst, но после миграции он перестал работать, и я не мог найти причину этого. Чтобы устранить любую другую возможную проблему, я решил создать небольшое консольное приложение и воспользовался пошаговым руководством по переносу данных, опубликованным командой ADO:

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

Я скопировал в точности код блога, но вместо того, чтобы работать корректно (создание БД, создание схемы и вставка блога) Я получаю некоторые ошибки:

  • создается только БД, но нет таблиц
  • Я получаю эту ошибку Преобразование не удалось при преобразовании даты и времени из символьной строки. "

Все это есть в SQL Server 2005 Express.

Я попробовал то же самое с помощью SQL Compact, но тот же результат (хотя и другая ошибка):

  • создается только БД (в данном случае файл sdf в папке bin), но нет таблиц
  • Я получаю error Недопустимый формат указанной даты или времени datepart. [ 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 каким-то образом отправляет данные в формате, несовместимом с моей локалью.

Спасибо Симона

8
задан CodeClimber 23 April 2012 в 14:36
поделиться