2009-07-27 62 views
3

考虑使用varchar(1) NULL字段定义的SQL Server表。它被用来存储性别角色。有些行有数据,有些不是:空或空白。授予空白应该是空值,但考虑空白在这里是一个有效的值。我更喜欢这个值为null。Linq To Sql:例外“字符串必须只有一个字符长”

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

运行的LINQ to SQL查询时,就会抛出一个例外,其中的someID值为3

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

异常

字符串必须是一个字符长。

问题:这个异常的原因是什么?可以做些什么来预防或消除这个问题?

+0

为什么不在SQL Server中使用Char(1)? – 2009-07-27 20:13:51

+2

@Dan - 因为将现有数据库模式更改为支持可以更容易更改的生成文件没有意义。 LINQ to SQL设计器在varchar(1)中使用Char的事实在我看来是一个错误。 – 2009-07-27 20:16:47

回答

15

检查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

注意:如果字符串的长度大于1,您可能需要考虑在属性的setter中添加一些验证以引发异常。

0

是否有可能像'''这样的空白数据不符合当前的表约束?例如。也许该表不允许空字符串(即使里面有一个)。

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

如果这是怎么回事,你可能会改变表的约束/设计允许空值,或只更新所有的空值NULL(假设允许NULL值)

0

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

相关问题