EntityFramework 6.x和EntityFramework Core必须须要MultipleActiveResultSets?

前言

本节咱们来探讨到底需不须要在链接字符串上加上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中运行上述代码就会抛出如上图异常(不要关心上述代码是否合理,或许您可能说直接使用显式加载对吧,如上代码旨在引出问题)。而后咱们在链接字符串上以下加上一句就能够解决问题。spa

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;code

总结

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

相关文章
相关标签/搜索