4

国際的に使用されている大規模な SaaS ASP .NET 4.0 アプリケーションがあります。従来の ADO データプロバイダーを Entity Framework に徐々に移行しています。

MS Sql サーバー 2008 を使用しています。トルコのお客様には、文字列にトルコ語の照合順序「Turkish_CI_AS」を使用しています。つまり、8 ビットの varchar フィールド (16 ビットの nvarchar 列は使用しません)

EF で新しいオブジェクトを追加すると、問題が発生しました。「ş」などの特殊文字は次のように変更されます。

    using (TestEntities myEntity = new TestEntities())
    {
                    MyObject test = new MyObject()
                    {
                        TestString = "baş"
                    };

                    myEntity.MyObjects.AddObject(test);
                    myEntity.SaveChanges();
    }

デバッガーをステップ実行すると、次のコード行で "test.TestString" は "baş" のままです。

myEntity.MyObjects.AddObject(test);

ただし、データベースでは、フィールド「TestString」の値は「bas」です。「ş」は「s」として保存されます。これは、私の古いデータプロバイダー メソッドでは発生しません。

EF を使用してデータベースにトルコ語の文字を追加するにはどうすればよいですか? 誰にも良い提案がありますか?私はかなりのことを試しましたが、それを理解することはできません:)

tnx、フランク

編集

小さなテスト セットアップでプロファイラーを実行すると、次のようになります。

exec sp_executesql N'insert [dbo].[TestObjects]([TestChar])
values (@0)
select [TestId]
from [dbo].[TestObjects]
where @@ROWCOUNT > 0 and [TestId] = scope_identity()',N'@0 varchar(255)',@0='Bas'

どうやら sql が間違った値を受け取ったようです。実際に責任があるのは .NET です。

4

1 に答える 1

2

わかりました。MySql では、接続文字列にエンコーディング情報を追加できますが、Microsoft sql ではこれが許可されていません。

EF は、既定のデータベースの照合順序を調べてエンコーディングを決定しているようです。私たちの設定では、データベースの照合順序は Latin1 でしたが、顧客固有のデータを含むテーブルの照合順序は "Turkish_CI_AS" です。

したがって、2つのオプションがあります。

1)データベース全体のデフォルトの照合を変更します(システムや構成テーブルなどへの影響)

2) 列を nvarchar に変更します

Unicode への変更は最終的に行われます。今のところ、動作する古き良き ADO.NET を使用します。:)

私と一緒に考えてくれたtnx

于 2013-01-24T09:58:33.343 に答える