前言

本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印。

EntityFramework 6.x和EntityFramework Core需要MultipleActiveResultSets?

很多童鞋遇到如下图中错误就立马想到在连接字符串上加上 MultipleActiveResultSets = true ,但是这样真的是最终解决方案么?

下面我们来看一段在EntityFramework 6.x中的代码,演示如上问题的出现。

            using (var ctx = new EfDbContext())
{
ctx.Database.Log = Console.WriteLine; var customers = ctx.Customers; foreach (var customer in customers)
{
ctx.Entry(customer).Collection(d => d.Orders).Load();
}
};

当您在EntityFramework 6.x中运行上述代码就会抛出如上图异常(不要关心上述代码是否合理,或许您可能说直接使用显式加载对吧,如上代码旨在引出问题)。然后我们在连接字符串上如下加上一句就可以解决问题。

connectionString="Data Source=WANGPENG;Initial Catalog=EntityFramework6;Integrated Security=true;MultipleActiveResultSets=True;"

我们知道MultipleActiveResultSets即MARS在SQL Server2005中被引入,意为单连接多请求,但是它非线程安全,在我看来这个特性在ADO.NET中可能非常适用,但是在EntityFramework 6.x中作用不大,虽然如上可以从数据库连接层面来解决问题,大部分这种情况的出现还是因为代码写的有问题,我们直接调用ToList即可,如下:

            using (var ctx = new EfDbContext())
{
ctx.Database.Log = Console.WriteLine; var customers = ctx.Customers.ToList(); foreach (var customer in customers)
{
ctx.Entry(customer).Collection(d => d.Orders).Load();
}
};

我们知道ToList是最终翻译成SQL语句请求数据库返回对应数据,即通过ToList既可以打开连接也可以关闭连接,当我们不用ToList时,此时打开了一个连接,同时已经有了一个DataReader,接下来遍历时则再会在Command上打开一个DataReader加载Orders,此时就会抛出第一个DataReader未关闭的情况,大部分出现这样的一样我们都可以通过ToList来解决,当然也可以用延迟加载(关于EF 6.x中延迟加载请谨慎适用,我在我的书中《你必须掌握的EntityFramework 6.x与Core 2.0》中也有讲到,除非您明确自己会正确使用)和显式加载来解决。那在EntityFramework Core中是否运行上述同样代码会抛出异常,然后我们需要在连接字符串上加上此特性呢?我们来看看。

            using (var context = new EFCoreDbContext())
{
var blogs = context.Blogs;
foreach (var blog in blogs)
{
context.Entry(blog).Collection(p => p.Posts).Load();
}
}

通过如上图我们知道完全不会如EntityFramework 6.x中抛出异常,这点有所不同。大部分情况下,出现如上异常或许可能是代码写的问题,不一定非得要加上 MultipleActiveResultSets=True;

总结

本文没有深入探讨文章标题,若您有抛出如上异常非得加上MultipleActiveResultSets=True才能解决问题,请留下您的评论,让我继续深入学习,在此表示感谢。接下来我会继续探讨和对比EntityFramework 6.x和EntityFramework Core中不为人知的秘密,同时也会陆续更新EF Core 2.1并深入探讨。

EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?的更多相关文章

  1. 你必须知道的EntityFramework 6.x和EntityFramework Core变更追踪状态

    前言 只要有时间就会时不时去看最新EF Core的进展情况,同时也会去看下基础,把握好基础至关重要,本节我们对比看看如标题EF 6.x和EF Core的不同,希望对正在学习EF Core的同行能有所帮 ...

  2. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  3. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  4. EntityFramework 7 更名为EntityFramework Core(预发布状态)

    前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...

  5. EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?

    前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...

  6. EntityFramework 6.x和EntityFramework Core插入数据探讨

    前言 一直以来对EF和EF Core都是单独分开来写,从未以比较的形式来讲解,如果您既用过EF 6.x也用过用EF Core是否有了解过EF和EF Core在插入数据时和返回主键有何异同呢?本篇博客是 ...

  7. .NET Core IdentityServer4实战 第三章-使用EntityFramework Core进行持久化配置

    内容:本文带大家使用IdentityServer4进行使用使用EntityFramework Core进行配置和操作数据 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 前两章内容 ...

  8. 第15章 使用EntityFramework Core进行配置和操作数据 - Identity Server 4 中文文档(v1.0.0)

    IdentityServer旨在实现可扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制.本快速入门展示了如何配置IdentityServer以使用EntityFramewo ...

  9. webapi core2.1 IdentityServer4.EntityFramework Core进行配置和操作数据

    https://identityserver4.readthedocs.io/en/release/quickstarts/8_entity_framework.html 此连接的实践 vscode ...

随机推荐

  1. RocketMQ4.4.0新特性分享

    rocketmq1.架构 MQ历史 由数据结构队列发展而来 MQ使用场景 异步处理 解耦 削峰填谷 数据同步2.队列3.使用 生产 同步(sync) 默认重试2次总共3次 默认等待超时时间为3s 异步 ...

  2. golang高并发的理解

    前言 GO语言在WEB开发领域中的使用越来越广泛,Hired 发布的<2019 软件工程师状态>报告中指出,具有 Go 经验的候选人是迄今为止最具吸引力的.平均每位求职者会收到9 份面试邀 ...

  3. 使用 Moq 测试.NET Core 应用 - Why Moq?

    什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...

  4. ES 08 - 创建、查看、修改、删除、关闭Elasticsearch的index

    目录 1 创建index(配置mapping[映射]) 2 查看index 3 修改index 4 删除index 5 打开/关闭index 6 常见问题及解决方法 index相当于RDBMS(关系型 ...

  5. Java集合详解1:ArrayList,Vector与Stack

    今天我们来探索一下LinkedList和Queue,以及Stack的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下 ...

  6. Java数组协变与范型不变性

    变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑.因为最近踩到了,便做一个记录.顺便也提一下范型的变性. 解释数组协变之前,先明确三个相关的概念,协变.不变和逆变. 一.协变.不变.逆 ...

  7. tomcat部署项目后,war包是否可刪?war包存在必要性!

    在tomcat中webapps目錄上傳war包后,  对war解压时候. war不能在tomcat运行时删除,否则会删除自动解压的工程. 你可以停止tomcat后删除war. 当你重新部署的时候,如果 ...

  8. 如何在ADO中使用数据读取器(DataReader)读取数据

    DbDataReader类型(实现IDataReader接口)是从数据源获取信息最简单也最快速的方法. 数据读取器是只读向前的效据流.井且一次返回一条记录.因此.只有当你向数据源提交 Select 查 ...

  9. mybatis bug之org.apache.ibatis.exceptions.PersistenceException:

    详细报错信息: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java. ...

  10. Manacher's Algorithm(马拉车算法)

    ## 背景 该算法用于求字符串的最长回文子串长度. ## 参考文章 >[最长回文子串——Manacher 算法](https://segmentfault.com/a/1190000003914 ...