1

当我尝试通过 EF 迁移对数据库进行版本控制时,出现错误“从字符串转换日期和/或时间时转换失败”。问题是我的 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 的数据库一起使用的方法。

4

2 回答 2

5

如果您仍想传入一个日期,您可以使用defaultSqlValue带有有效 SQL 日期时间的可选参数。例如:

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

就这样这个问题有了答案,答案是:

将 SQL Server 数据库兼容模式从 SQL Server 2000 至少切换到 SQL Server 2005,日期字符串解析的问题就会消失。

于 2012-03-25T18:38:21.667 回答