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

  • 相关阅读:
    C/S和B/S结构区别整理
    JavaScript特点、优缺点及常用框架
    ExtJs特点、优缺点及注意事项
    Oracle SQL 脚本跟踪
    解决 C#中 SQL脚本执行超时 问题
    oracle 时间转化函数及常见函数 .
    Spring.NET 1.3.2 集成 NHibernate 3.2 1 下载软件
    SQL Server 跨服务器 不同数据库之间复制表的数据的方法:
    spring.net nhibernate 分布布式事务(上)
    set xact_abort ON 你懂的, 在分布式数据库事务中,用到. 在事务中,若出现错误,系统即默认回滚事务
  • 原文地址:https://www.cnblogs.com/dxy1982/p/4818855.html
Copyright © 2020-2023  润新知