1

EF移行によってデータベースをバージョン管理しようとすると、「文字列から日付や時刻を変換するときに変換に失敗しました」というエラーが発生します。問題は、EFが新しい移行スクリプトエントリに対して生成した日付文字列( '2012-03-21T18:23:13.525Z')が、私のバージョンのMS Sql Server(Microsoft SQL Server Express Edition with Advanced Services(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とは何の関係もありません。SQLServerデータベースがSQLServer2000と下位互換性があるように構成されている場合、その日付形式は受け入れられません。EFに日付文字列を別の形式で出力させる(またはSQL Serverを2000と逆互換にし、EF日付文字列を理解する)ことができない限り、データベースでEF移行を使用することはできません。 -(。互換性レベルがSQLServer2000のデータベースでEFを使用する方法を誰かが考案したかどうかを教えてください。

4

2 に答える 2

5

それでも日付を渡したい場合はdefaultSqlValue、有効なSQLDateTimeでオプションのパラメーターを使用できます。例えば:

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', 
于 2012-11-26T13:29:02.583 に答える
2

この質問に答えがあるので、答えは次のとおりです。

SQLServerデータベース互換モードをSQLServer2000から少なくともSQLServer2005に切り替えると、日付文字列の解析に関する問題が解消されます。

于 2012-03-25T18:38:21.667 に答える