在SaveChanges(EF6.1)上,日期字段从英国变为美国文化

时间:2015-01-06 14:20:56

标签: asp.net vb.net entity-framework

我正在使用自定义重载的SaveChanges来实现一些审核功能。除了与日期相关的一些意外行为外,该功能完美运行。在此示例中,我将日期字段值从2014年5月1日更改为2014年5月2日:

此处对数据库进行了更改:

 Public Function UpdateTask(request As DataSourceRequest, ThisTask As JobTasksVM) As JsonResult
        Dim cu As ApplicationUser = GetCurrentUser()
        Dim CurrentTask = db.events.Find(ThisTask.id)

        CurrentTask.start_date = ThisTask.start '<--- 2/5/2014 (ie 2nd May 2014), was previously 1/5/2014
        CurrentTask.date = ThisTask.end
        CurrentTask.task_name = ThisTask.Title

        db.SaveChanges(cu.Employee_id)
    End Function

我的自定义SaveChanges拦截了这个:

 Public Overloads Function SaveChanges(userID As Integer) As Integer

    For Each entry As dbentityentry In Me.ChangeTracker.Entries().Where(Function(e) e.State <> EntityState.Unchanged)
            Dim startOriginal As DateTime = entry.OriginalValues.Item("start_date")
            Dim StartCurrent As DateTime = entry.CurrentValues.Item("start_date")
            etc....

奇怪的是,虽然提交的CurrentTask.start_date明确显示2014年2月5日(2014年5月2日)的正确(英国)日期,但重载的SaveChanges中的值为:

startOriginal:2014年1月5日(即2014年1月5日)&lt; - 似乎已改为美国文化

startCurrent:2/5/2014(即2014年5月2日)&lt; ---按预期

我需要在审核功能中使用原始值,因此这会导致问题。我也尝试过:

entry.CurrentValues.SetValues(entry.GetDatabaseValues)

但是这也会将错误的(即美国格式5/1/2014)加载到start_date字段中。

我检查了系统上的所有文化设置,它们都是正确的英国 - 英国。这种行为似乎根本不一致 - 我错过了什么?! 感谢

1 个答案:

答案 0 :(得分:1)

DateTime类型没有格式,它们只是一个值(自1/1/0001以来的滴答数)。

您没有说明您在哪里看到“错误”格式,无论是ToString()输出还是智能感知。如果您使用ToString到“输出”窗口,您应该会看到英国格式,因为ToString将使用/尊重计算机的本地文化设置。

Intellisense与文化无关,并尝试使用明确的格式:MM/dd/yyyy。这与从文字创建DateTime var时必须使用的“格式”或顺序相同:

Dim dt As DateTime = #1/5/2014#      ' e.g. MM/dd/yyyy
' same as:
Dim dt As New DateTime(1, 5, 2014)   ' mm, dd, yyyy

这是InvariantCulture(不是美国)。将鼠标悬停在var上时,VB IDE将使用相同的顺序。它试图通过显示哈希值#1/5/2014#来明确它使用所需的文字/ InvariantCulture格式。

Dim dt As DateTime = #2/11/2011#
Console.WriteLine(dt.ToString)

在美国,2/11/2011将根据文化显示 在英国,它将是11/2/2011
Intellisense将是#2/11/2011#