EF 4.3.1 Миграции - сбой преобразования при преобразовании даты и / или времени из символьной строки

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

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 ('201203210144184_init', '2012-03-21T18:23:13.525Z',  0x33, '4.3.1');

ИЗМЕНИТЬ

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


comment
Я думаю, что EF официально не поддерживает SQL Server 2000 и его уровень совместимости, поэтому можно перенести вашу базу данных на более новую поддерживаемую версию.   -  person Ladislav Mrnka    schedule 21.03.2012
comment
Да, сохранение режима совместимости в более ранней версии не позволяет базе данных использовать новые функции экземпляра sql server. К счастью, я убедил ИТ-специалистов переключить режим совместимости на SQL Server 2008 (база данных уже была перенесена на SQL Server 2008).   -  person enamrik    schedule 22.03.2012


Ответы (2)


Если вы все еще хотите передать Date, вы можете использовать необязательный параметр 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', 
person Jonathan Dickinson    schedule 26.11.2012
comment
Это отлично сработало для меня. (После исправления логической ошибки: неиспользуемый параметр dt в DateTimeToSql()) - person Albert Bori; 29.11.2013
comment
Вот что происходит, когда вы собираете образец из тестового консольного приложения. Спасибо @AlbertBori - person Jonathan Dickinson; 10.01.2014

Так что на этот вопрос есть ответ, ответ таков:

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

person enamrik    schedule 25.03.2012
comment
Мой был настроен на SQL Server 2008, и проблема все еще возникала. - person Lord of Scripts; 18.02.2016