C# 实体框架使用错误的字符串编码?

C# 实体框架使用错误的字符串编码?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,如果我使用Entity Framework(将现有数据库迁移到EF)将字符串写入SQL Server表,然后在SQL Server Management Studio中测量字符串长度,那么我的字符串太长了。不同的排序规则类型似乎在字符串末尾添加了一堆空白 是否必须显式设置EF的排序规则类型?如果是的话,还有比这更好的方法吗 已获取默认排序规则: SELECT SERVERPROPERTY('collation') SQLServerCollation 结果: SQL_Latin1_Genera

如果我使用Entity Framework(将现有数据库迁移到EF)将字符串写入SQL Server表,然后在SQL Server Management Studio中测量字符串长度,那么我的字符串太长了。不同的排序规则类型似乎在字符串末尾添加了一堆空白

是否必须显式设置EF的排序规则类型?如果是的话,还有比这更好的方法吗

已获取默认排序规则:

SELECT SERVERPROPERTY('collation') SQLServerCollation
结果:

SQL_Latin1_General_CP1_CI_AS 
我这样测量字符串(当字符串为“Bill”时,返回51个字符):

请注意!将添加到字符串的末尾,因为默认情况下,SQL Server在计算长度时不测量空白。此外,当我在没有指定排序规则的情况下运行此命令时,我得到了一个错误:

无法解决concat操作中“SQL\u Latin1\u General\u CP1\u CI\u AS”和“Latin1\u General\u 100\u CI\u AS”之间的排序规则冲突

AppUser
EF类:

[Table("AppUser")]
public partial class AppUser
{
    [Key]
    public int user_id { get; set; }

    [StringLength(50)]
    public string first_name { get; set; }

    [StringLength(50)]
    public string last_name { get; set; }
    .....

这个问题与您的排序无关。您的列类型是
CHAR(50)
。在该类型的列中,字段的其余内容用空格填充,因此实际上不是
Bill
而是
Bill\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

因此,您需要将数据类型更改为
VARCHAR(50)
,或者需要修剪空格:

SELECT len(concat(rtrim(first_name), '!'))
FROM [GreenCardSite].[dbo].[AppUser]
WHERE user_id = 16840

AppUser
的列数据类型是什么?很有趣。我不知道发生了什么事。您确定它与ANSI_填充设置无关吗?是什么让你觉得你的专栏结尾没有空格?@DavidG,我在上面添加了分部类声明。我确信没有空白,因为我在运行测试之前使用EF显式更新了值,并硬编码了字符串“Bill”。注意,这与实体框架无关,底层SQL类型是什么?
SELECT len(concat(rtrim(first_name), '!'))
FROM [GreenCardSite].[dbo].[AppUser]
WHERE user_id = 16840