4

我们有一个在国际上使用的大型 SaaS ASP .NET 4.0 应用程序。我们正在慢慢地将我们的经典 ADO 数据提供程序迁移到实体框架。

我们使用 MS Sql server 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”。

所以我有两个选择:

1)更改整个数据库的默认排序规则(对系统和配置表等的影响)

2) 将我的列更改为 nvarchar

最终将更改为 unicode,现在我们将使用一些可以正常工作的旧 ADO.NET!:)

tnx 和我一起思考

于 2013-01-24T09:58:33.343 回答