C# 无法在实体框架中使用土耳其语字符

C# 无法在实体框架中使用土耳其语字符,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我们有一个大型SaaS ASP.NET 4.0应用程序在国际上使用。我们正在慢慢地将经典的ADO数据提供程序迁移到实体框架 我们使用MS Sql server 2008。对于土耳其客户,我们对字符列使用土耳其排序规则“Turkish_CI__AS”。即8位varchar字段(我们不使用16位nvarchar列) 现在我在使用EF添加新对象时遇到了一个问题。“ş”等特殊字符已更改: using (TestEntities myEntity = new TestEntities())

我们有一个大型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。

好的,我想出来了。在MySql中,可以在连接字符串中添加编码信息,Microsoft sql不允许这样做

EF似乎通过查看默认数据库排序规则来确定编码。在我们的设置中,数据库排序规则是Latin1,而具有客户特定数据的表具有排序规则“Turkish_CI_AS”

所以我有两个选择:

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

2) 将我的列更改为nvarchar

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


tnx感谢您与我一起思考

您是否使用Sql分析器查看实际的Sql运行情况?是的。另外,你似乎认为土耳其客户从来没有外国角色。我强烈建议使用NVARCHAR——其余的都是严重忽视。甚至在土耳其,我明白你的意思。我们正在处理多年的遗留代码和db模式。“仅切换到nvarchar”目前不是一个选项。请注意,默认情况下,CLR字符串使用Unicode,这是您在调试器中看到的。然后字符转换为8位,您将丢失“ş”。如果无法将数据库更改为nvarchar,则可以尝试将字符串转换为,以便与数据库中的内容匹配。我将从Econding类开始看——它可以返回代码页的编码。SQL Server不需要这样做。混淆排序规则是一个设计问题。EF也不使用自己的驱动程序,它使用ADO.NET。它们可能共享一个驱动程序,使用公共驱动程序的库的行为是不同的。但我们领先了6年,我的问题解决了:)相反,是同一个司机。EF从未出现过任何问题-混合排序规则和代码页总是会导致问题。ADO.NET也一样-如果使用ADO.NET和
varchar
参数,在
varchar
字段中使用拉丁1编码存储土耳其文本,您将得到乱码文本。