zoukankan      html  css  js  c++  java
  • 【netcore入坑记】 .Net core UseRowNumberForPaging 分页报错 SQL Server 2008 R2 EntityFrameworkCore

    异常环境:

    netcore版本:.Net Core 2.1

    efcore版本:Microsoft.EntityFrameworkCore.SqlServer 2.1.1

    sql sqlserver 版本:SQL Server 2008 R2

    报错代码:

    为了兼容2008数据库,配置了 RowNumberForPaging

                var optionsBuilder = new DbContextOptionsBuilder<DbObjectContext>();
                optionsBuilder.UseSqlServer(connStr, b => b.UseRowNumberForPaging());
                builder.RegisterType<DbObjectContext>()
                    .As<IObjectContext>()
                    .WithParameter("options", optionsBuilder.Options)
                    .InstancePerLifetimeScope();

    查询

                var query = _menuService.Where(t => t.MenuType == req.TypeID)
                    .Where(t => t.IsDel == false)
                    .Where(t => t.SchoolId == schoolid);
    
                var count = query.Count();
                var list = new List<CrmCarouselListItem>();
    
                if (count > 0)
                {
                    var index = req.GetPageIndex();
                    var size = req.GetPageSize();
    
                    query = query.OrderBy(t => t.OrderAsc)
                        .Skip((index - 1) * size)
                        .Take(size);
    
                    List<TMenu> rs = null;
    
                    rs = query.ToList();
    
                }

    代码在ToList()方法报异常,而且是并发查询偶尔发生

    错误信息:

     错误信息不定,一般是莫名其妙的错误或者sql语法错误

    例如

    System.Data.SqlClient.SqlException (0x80131904): 无法绑定由多个部分组成的标识符 "t0.__RowNumber__"

    或者字段格式错误

    An exception occurred while reading a database value for property 'TMenu.ImgUrl'. The expected type was 'System.String' but the actual value was of type 'System.Int32'.

    或者莫名的index错误

    System.IndexOutOfRangeException: Index was outside the bounds of the array.

    等等

    去github上EF开源项目,搜索问题发现有人已经提出了一些问题,下面这个应该对应我们上面的字段格式错误,因为EF自动生成的sql查询字段重复导致了错位

    The column 'X' was specified multiple times for 'Y' #13922

    https://github.com/aspnet/EntityFrameworkCore/issues/5641

    或者

    RowNumberForPaging, two tables and columns with same name #5641

    https://github.com/aspnet/EntityFrameworkCore/issues/5641

    后来有个大胡子回复了,大概意思是问我们为什么还在用这个,他们打算弃用的,sql server 2008版本不再打算继续支持了

    Consider removing UseRowNumberForPaging #13959

     https://github.com/aspnet/EntityFrameworkCore/issues/13959

    Because it is generally only needed in SQL Server 2008, which is out of support.
    
    If you're reading this and you use UseRowNumberForPaging, then please comment on this issue and let us know why you are using it.

    好吧,掉坑里去了,不用分页应该不会出现这个问题,只要使用了sql server 2008的rownumber分页功能,并且在并发情况下才有概率出现这个问题

    坑爹的微软啊,直接说让我们用新版本,新版本授权不要钱麽。。。

    更新于2018-11-27

    后来大胡子又说不打算停止更新了,将继续支持这个版本的分页

    https://github.com/aspnet/EntityFrameworkCore/issues/13959

    不过将在3.0版本进行发布,估计得2019年了

    等吧,哈哈哈

    剧终

  • 相关阅读:
    工作中用到知识点
    工作中遇到问题的解决办法
    透明度兼容性(ie8以上)
    js阻止浏览器默认行为
    js停止冒泡和阻止浏览器默认行为
    js添加事件通用方法
    jquery常用插件
    延迟加载、异步加载js
    JavaScript兼容性问题
    创建对象的一种方式&一种继承机制(代码实例)
  • 原文地址:https://www.cnblogs.com/jhli/p/9962372.html
Copyright © 2011-2022 走看看