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#
我正在使用自定义重载的 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#