Linq To Sql:异常"字符串必须正好一个字符"

p.c*_*ell 3 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查询时引发异常,其值为someID3.

var emp = (from e in db.Employees
           where e.ID == someID
           select e);
Run Code Online (Sandbox Code Playgroud)

例外:

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

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

And*_*are 15

检查EmployeeLINQ to SQL设计器为您创建的类型.很可能是Gender属性的类型System.Char(LINQ to SQL设计器使用的类型varchar(1)),应该更改为a System.String以正确匹配数据库模式.

该LINQ to SQL设计解释一个事实varchar(1)System.Char是愚蠢的考虑,这是有效的T-SQL:

declare @foo varchar(1);
set @foo = '';
Run Code Online (Sandbox Code Playgroud)

这是无效的 C#:

Char foo = '';
Run Code Online (Sandbox Code Playgroud)

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

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