1

我在多语言站点中使用 EF 将结果从 SP 映射到对象。

ctx.Database.SqlQuery<MyDTO>("MySP {0}", Id).SingleOrDefault()

我发现当文化发生变化时映射日期存在问题。

16/12/2015 09:06:15更具体地说,我得到与或相同的日期12/16/2015 09:06:15,具体取决于用户文化。

我知道两种解决方案:

  • 将日期作为字符串获取并使用CultureInfo.InvariantCulture.
  • CultureInfo.CultureInvariant在调用存储库方法之前切换文化。

也许还有另一种选择:

  • 我看到我们同时更改了:Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture用户的语言环境,但我认为我们应该只切换 UI 之一。但我不确定如果我改变它会破坏什么......

有没有其他选择,比如在 EF 上下文中设置文化?


更新:在进行查询之前 更改Thread.CurrentThread.CurrentUICultureandThread.CurrentThread.CurrentCulture似乎也无济于事。这令人困惑......也许 EF 在更早的时候缓存了文化?

4

3 回答 3

1

您可以将日期时间存储为长(柚木)或实数(将日期时间转换为实数时获得的数字)。然后,您可以将这些值转换为任何文化而不会造成任何损失。

于 2015-12-18T08:38:31.733 回答
1

首先,你应该避免像那样调用你的存储过程——这是解决OWASP Top 10 Sql Injection 安全问题的简单方法。

相反,您应该通过将参数作为实际参数传递给存储过程来调用,例如:

string dateAsString = "12/16/2015 09:06:15";
string dateFormat = "MM/dd/yyyy HH:mm:ss";
DateTime theValue = DateTime.Parse(dateAsString, dateFormat, CultureInfo.InvariantCulture);
SqlParameter myDate = new SqlParameter("@theDate", theValue);
context.Database.ExecuteSqlCommand("MySP @theDate", theDate);
于 2015-12-18T08:37:48.753 回答
0

我最终弄清楚了这一点。:)

我正在查看DateTime手表中 s 的值。这实际上是问题所在......看起来手表使用当前线程的文化(从而将月份和日期的顺序从文化切换到文化)。事实证明日期是正确的(12/16/2015 09:06:15如果您认为 16 月是一个月,这无论如何都不是有效的日期......永远不会太迟意识到......)。

所以,VS观察者让我迷失了方向......

很高兴知道当前的线程文化不会影响 SQL 数据的解析,正如我所期望的那样。:)

实际的错误是稍后在代码中的。

于 2015-12-18T10:37:45.203 回答