Linq To Sql:exception“String必须正好一个字符”

考虑使用varchar(1) NULL字段定义的SQL Server表。 它被用来存储性别角色。 有些行有数据,有些没有:null或空白。 当然空白应该为空,但在这里考虑空白是一个有效值。 我更喜欢这个值为null。

 ID性别
 1'M'
 4'M'
 3''
 4'F'

运行Linq To Sql查询时会引发exception,其中someID值为3。

 var emp = (from e in db.Employees where e.ID == someID select e); 

例外

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

问题 :此exception的原因是什么? 可以采取哪些措施来预防或消除这个问题?

检查LINQ to SQL设计器为您创建的Employee类型。 很可能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#:

 Char foo = ''; 

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

注意: 您可能需要考虑在属性的setter中添加一些validation,以便在字符串的长度大于1时抛出exception。

是否有可能像”这样的空白数据不符合表格的当前限制? 例如,表格可能不允许空字符串(即使其中有一个字符串)。

然后,也许LINQ正在为您应用这些约束,或者期望满足这些约束并抱怨它们不是。

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

当Linq To SQL Designer尝试自动生成结果类以保存存储过程结果时,也会发生此问题。 将自动生成的类复制到您自己的新类文件(使用相同的名称)并在那里进行更改。 每次更新DataContext时,只会删除自动生成的类。 不是理想的解决方案,而是2008年的解决方案。