zoukankan      html  css  js  c++  java
  • Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"

    场景再现

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

    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 + "	Name:" + item.Name);
    }

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

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

    异常截图

    在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?

  • 相关阅读:
    My Tizen
    Tizen参考手机RD210和RDPQ
    软件包管理 rpm yum aptget dpkg
    Adobe Acrobat 9 Pro 破解方法
    DataReader转DataSet例子
    使用BindingSource发生错误:Microsoft.VisualStudio.DataDesign.SyncDesigner.SyncFacade.SyncTableConfigManager 的类型初始值设定项引发异常
    CodeSmith的模板被exclude了,要恢复回来的一些技巧(转)
    SQL配置远程连接
    c#各进制之间的转换
    操作ini文件的公共类
  • 原文地址:https://www.cnblogs.com/dxy1982/p/4818855.html
Copyright © 2011-2022 走看看