SaveChanges (EF6.1) 后日期字段从英国文化更改为美国文化

Date field changing from UK to US culture upon SaveChanges (EF6.1)

我正在使用自定义重载的 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 清楚地显示正确的(英国)日期 2/5/2014(2014 年 5 月 2 日),但重载的 SaveChanges 中的值是:

startOriginal:5/1/2014(即 2014 年 1 月 5 日)<-- 似乎已更改为美国文化

开始时间:2/5/2014(即 2014 年 5 月 2 日)<---如预期

我需要在我的审计功能中使用原始值,所以这导致了一个问题。我也试过:

entry.CurrentValues.SetValues(entry.GetDatabaseValues)

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

我已经检查了系统上的所有文化设置,它们都是正确的英式英语。这种行为似乎根本不一致——我是不是漏掉了什么?! 谢谢

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

你没有说你在哪里看到 "wrong" 格式,无论是 ToString() 输出还是在智能感知中。如果您对输出 window 使用 ToString,您应该会看到 UK 格式,因为 ToString 将 use/respect 计算机的本地文化设置。

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

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 将使用相同的顺序。它试图通过显示 哈希来表明它正在使用所需的 literal/InvariantCulture 格式:#1/5/2014#

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

在美国,2/11/2011 将根据文化显示
在英国,它将是 11/2/2011
智能感知将是 #2/11/2011#