不能将土耳其字符与Entity Framework一起使用

时间:2013-01-23 15:22:21

标签: 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())
    {
                    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负责人。

1 个答案:

答案 0 :(得分:1)

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

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

所以我有两个选择:

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

2)将我的列更改为nvarchar

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

tnx和我一起思考