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

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

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.

Ответы [ 2 ]

5 голосов
/ 26 ноября 2012

Если вы все еще хотите передать 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', 
2 голосов
/ 25 марта 2012

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

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

...