C# Linq到Sql:异常;字符串长度必须正好为一个字符;

C# Linq到Sql:异常;字符串长度必须正好为一个字符;,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,考虑使用varchar(1)NULL字段定义的SQL Server表。它被用来储存性别特征。有些行有数据,有些行没有:null或空白。假定空白应该是空值,但是考虑到空白是一个有效的值。我更希望该值为null ID Gender 1 'M' 4 'M' 3 '' 4 'F' 异常: 字符串长度必须正好为一个字符 问题:此异常的原因是什么?如何防止或消除此问题?检查LINQ to SQL设计器为您创建的员工类型。Gender属性的类型很可能是System

考虑使用
varchar(1)NULL
字段定义的SQL Server表。它被用来储存性别特征。有些行有数据,有些行没有:null或空白。假定空白应该是空值,但是考虑到空白是一个有效的值。我更希望该值为null

ID Gender 1 'M' 4 'M' 3 '' 4 'F' 异常

字符串长度必须正好为一个字符


问题:此异常的原因是什么?如何防止或消除此问题?

检查LINQ to SQL设计器为您创建的员工类型。
Gender
属性的类型很可能是
System.Char
(这是LINQ to SQL设计器用于
varchar(1)
)的类型,应该更改为
System.String
,以正确匹配数据库架构

LINQ to SQL设计器将
varchar(1)
解释为
System.Char
的事实是愚蠢的,因为这是有效的T-SQL:

declare @foo varchar(1);
set @foo = '';
这是无效的C#:

由于生成的属性类型限制性太强,您需要将其更改为
System.String


<强>注:您可能想考虑在属性的设置器中添加一些验证,如果字符串的长度大于1,则抛出异常。

< P>有可能像“’”这样的空白数据不符合表的当前约束吗?例如,表可能不允许空字符串(即使其中有一个)

然后,也许LINQ正在为您应用这些约束,或者期望这些约束得到满足,并抱怨它们没有得到满足


如果这是正在发生的,您可能会更改表的约束/设计以允许空白值,或者只是将所有空白值更新为NULL(假定允许空值)

< P>,当LINQ to SQL设计器尝试自动生成结果类,以保存存储过程结果时,也会发生此问题。将自动生成的类复制到您自己的新类文件中(使用相同的名称)并在其中进行更改。每次更新DataContext时,都只是删除自动生成的类。这不是一个理想的解决方案,但却是2008年的一个解决方案。

为什么不在SQL Server中使用Char(1)?@Dan-因为更改现有数据库架构以支持更容易更改的生成文件是没有意义的。在我看来,LINQ to SQL设计器对varchar(1)使用Char的事实是一个错误。这里有更多信息和很好的解释:…如果您有很多varchar(1)字段,使用中的更新/同步功能将自动更正这些字段的映射(从Char到字符串)。
declare @foo varchar(1);
set @foo = '';
Char foo = '';