1

多言語サイトで EF を使用して、SP からオブジェクトに結果をマップしています。

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

カルチャが変更されたときの日付のマッピングに問題があることがわかりました。

より具体的には、ユーザーの文化に応じて、16/12/2015 09:06:15またはと同じ日付を取得します。12/16/2015 09:06:15

私はこれに対する2つの解決策を知っています:

  • 日付を文字列として取得し、 で解析しCultureInfo.InvariantCultureます。
  • CultureInfo.CultureInvariantリポジトリ メソッドを呼び出す前にカルチャを切り替えます。

そしておそらく別のオプションがあります:

  • Thread.CurrentThread.CurrentUICultureとユーザーのロケールの両方を変更しているように見えThread.CurrentThread.CurrentCultureますが、UI のみを切り替える必要があると思います。しかし、これを変更すると何が壊れるかわかりません...

EF コンテキストにカルチャを設定するなど、代替手段はありますか?


更新: クエリを実行する直前にThread.CurrentThread.CurrentUICultureand を変更Thread.CurrentThread.CurrentCultureしても、どちらも役に立たないようです。それは紛らわしいです...おそらく、EFは以前の時点でカルチャをキャッシュしますか?

4

3 に答える 3

1

まず、ストアド プロシージャをそのように呼び出すことは避けるべきです。これは、OWASP Top 10 Sql インジェクションのセキュリティ問題を発生させる簡単な方法です。

代わりに、ストアド プロシージャに引数を実際のパラメーターとして渡すことで呼び出す必要があります。たとえば、次のようになります。

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 に答える