转载

Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, v...

场景再现

我需要查询公司名称包含给定字符串的公司,于是我写了下面的测试小例子:

var condition = "测试"; var query = from b in db.Companies    where (condition == null || condition == "") ? true : b.Name.Contains(condition)    orderby b.CompID    select new    {     CompID = b.CompID,     Name = b.Name    }; Console.WriteLine("All companies in the database:"); foreach (var item in query) {  Console.WriteLine("ID:" + item.CompID + "/tName:" + item.Name); } 

没想到运行的时候出现如下异常:

异常信息:“p__linq__1 : String truncation: max=0, len=2, value='测试'”。

异常截图:

Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, v...

在EF的映射关系中,我明明将Name一项设了最大长度是64:

public class CompanyMap : EntityTypeConfiguration<Company> {  public CompanyMap()  {   ToTable("Companies");   HasKey(p => p.PKCompany);   Property(p => p.Name).IsRequired().HasMaxLength(64).HasColumnName("Company");   Property(p => p.IsChecked).IsRequired();  } } 

那为什么查询的时候会说最大长度是0,而传入的参数长度是2,超过了这个0呢?

问题方案

我尝试把where部分的三元表达式前面去掉,直接使用contains判断是没问题的,于是我怀疑是三元表达式那个条件出问题了,而提示字符串最大长度是0,我想到可能是判断空字符那个条件有问题,所以我提前处理了一下,把程序改成如下,然后绕过了这个异常:

var condition = "测试"; //... condition = (condition == null || condition == "") ? null : condition; var query = from b in db.Companies  where condition == null ? true : b.Name.Contains(condition)  orderby b.CompID  select new  {      CompID = b.CompID,      Name = b.Name  }; 

如果条件为null或者为空字符"",那么都改成空null,这么改完以后程序就工作了。

我查找了不少资料,介绍的方案都不是太有用,这里记录一下如果有遇到这个异常的同学可以试一下!

这里我也没用LinqPad去测试翻译的结果,这个难道是EF的一个bug?

正文到此结束
Loading...