我在多语言网站中使用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.CurrentUICulture
和Thread.CurrentThread.CurrentCulture
都更改为用户的语言环境,但我认为我们应该只切换UI。但是我不确定如果我改变这个会破坏什么...... 有没有其他选择,比如在EF背景下设置文化?
更新
在进行查询之前查看Thread.CurrentThread.CurrentUICulture
和Thread.CurrentThread.CurrentCulture
似乎也没有帮助。这让人感到困惑......也许EF在较早的时候缓解了文化?
答案 0 :(得分: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);
答案 1 :(得分:1)
您可以将日期时间存储为长(柚木)或实际(当您将施法日期时间变为实际时)。然后,您可以将这些值转换为任何文化而不会有任何损失。
答案 2 :(得分:0)
我最终想出了这个。 :)
我正在观看手表中DateTime
s的值。这实际上是问题......看起来手表使用当前线程的文化(从而将月份和日期的顺序从文化转换为文化)。事实证明日期是正确的(如果您考虑将16作为月份,则12/16/2015 09:06:15
无法成为有效日期......永远不会太晚意识到......)。
所以,VS观察者迷惑了我......
很高兴知道当前的线程文化不会像我期望的那样影响SQL数据的解析。 :)
实际的错误是后来的代码。