1

Я получаю сообщение об ошибке «Ошибка конверсии при преобразовании даты и/или времени из символьной строки», когда я пытаюсь получить версию моей базы данных путем миграции EF. Проблема заключается в том, что строка даты, сгенерированная EF ('2012-03-21T18: 23: 13.525Z') для новых записей сценария миграции, не поддерживается моей версией MS Sql Server (Microsoft SQL Server Express Edition с расширенными службами (64- немного)). Это ошибка? Есть ли работа?EF 4.3.1 Миграции - преобразование не удалось при преобразовании даты и/или времени из символьной строки

CREATE TABLE [__MigrationHistory] (
    [MigrationId] [nvarchar](255) NOT NULL, 
    [CreatedOn] [datetime] NOT NULL, 
    [Model] [varbinary](max) NOT NULL, 
    [ProductVersion] [nvarchar](32) NOT NULL, 
    CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId]) 
) 
BEGIN TRY 
    EXEC sp_MS_marksystemobject '__MigrationHistory' 
END TRY 
BEGIN CATCH 
END CATCH 
INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) 
VALUES ('144184_init', '2012-03-21T18:23:13.525Z', 0x33, '4.3.1'); 

EDIT

Nevermind. Это не имеет ничего общего с EntityFramework. Если моя база данных SQL Server настроена на обратную совместимость с SQL Server 2000, она не примет формат даты. Я предполагаю, что если я не смогу получить EF для вывода строки даты в другом формате (или заставить SQL Server обойтись совместимо с 2000 годом и все еще понимать строку даты EF), я не смогу использовать EF-миграции с моей базой данных: . - (Пожалуйста, дайте мне знать, если кто-то разработал способ использовать EF с базой данных с уровнем совместимости SQL Server 2000.

+0

Я думаю, что EF официально не поддерживает SQL Server 2000 и его уровень совместимости на всех, так что вариант переноса базы данных на новую поддерживаемую версию. –

+0

Да, сохранение режима совместимости в нижней версии не позволяет базе данных использовать более новые функции экземпляра SQL-сервера. К счастью, я убедил IT переключить режим совместимости на SQL Server 2008 (база данных уже перенесена на SQL Server 2008) – enamrik

ответ

2

Просто так этот вопрос ответ, ответ:

Переключите SQL Режим совместимости базы данных сервера с SQL Server 2000 до минимального SQL Server 2005 и проблема с синтаксисом строки даты исчезнут.

+0

Mine был настроен на SQL Server 2008 и все еще обнаружил проблему. –

5

Если вы все еще хотите передать дату, вы можете использовать defaultSqlValue необязательный параметр с действующим SQL DateTime. Например:

public partial class AddTransactionDate : DbMigration 
{ 
    public override void Up() 
    { 
     // defaultValueSql is where the magic happens. 
     AddColumn("dbo.StorageTransaction", "Created", c => c.DateTime(nullable: false, defaultValueSql: DateTimeToSql(DateTime.UtcNow))); 
    } 

    public override void Down() 
    { 
     DropColumn("dbo.StorageTransaction", "Created"); 
    } 

    private static string DateTimeToSql(DateTime dt) 
    { 
     // Use the .Net SqlDateTime class to create a valid 
     // SQL server DATETIME. We also need to wrap it in quotes 
     // because EF prints out your values verbatim (e.g. you could 
     // also use GETUTCDATE() etc.). 
     return string.Format("N'{0}'", 
      new System.Data.SqlTypes.SqlDateTime(dt).ToSqlString()); 
    } 
} 

И вуаля:

ALTER TABLE [dbo].[StorageTransaction] ADD [Created] [datetime] NOT NULL DEFAULT N'2012-11-26 03:06:09 PM' 
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion]) 
VALUES ('201211261300214_AddTransactionDate', 'Symblr.Migrations.Configuration', 
+1

Боковое примечание: твой трюк для совместимости не работает для меня. –

+0

Это отлично сработало для меня. (После исправления логической ошибки: неиспользуемый параметр 'dt' в' DateTimeToSql() ') –

+0

Это то, что происходит, когда вы собираете образец из тестового консольного приложения. Спасибо @AlbertBori –

Смежные вопросы

 Смежные вопросы