EF7多上下文共用单连接:如何避免事务内连接被自动关闭?
EF7单事务并行多上下文报错“Invalid operation. The connection is closed.”的解决
我需要在单个事务中并行运行多个Entity Framework 7(EF7)上下文,但运行时遇到错误:Invalid operation. The connection is closed. Entity framework 7.。排查后发现EF7上下文完成操作后会自动关闭连接,原本想尝试让上下文不自动关闭连接,最终通过在数据库连接字符串中添加MultipleActiveResultSets=True解决了问题。
尝试的代码示例
try { using (var connection = new SqlConnection(Properties.Settings.Default.ConnectionString)) { var options = new DbContextOptionsBuilder<MyContext>() .UseSqlServer(connection) .Options; connection.Open(); using (var transaction = connection.BeginTransaction()) { var Tasks = new List<Task>(); Tasks.Add(Task.Run(() => { Parallel.ForEach(someList1, groping => { using (var db = new MyContext(options)) { db.Database.UseTransaction(transaction); // 添加someList1的数据到数据库 } }); })); Tasks.Add(Task.Run(() => { Parallel.ForEach(someList2, groping => { using (var db = new MyContext(options)) { db.Database.UseTransaction(transaction); // 添加someList2的数据到数据库 } }); })); Task.WaitAll(Tasks.ToArray()); transaction.Commit(); } } } catch (Exception) { }
解决方法说明
核心原理
EF7默认会在上下文生命周期结束时关闭关联的数据库连接,但当我们在单个连接上并行操作多个上下文时,需要允许同一连接存在多个活跃的操作。MultipleActiveResultSets=True(简称MARS)是SQL Server的特性,开启后允许单个数据库连接同时处理多个请求,避免了并行操作时因连接被上下文关闭或占用而抛出的连接关闭错误。
只需在数据库连接字符串末尾添加该配置项即可生效,例如:
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;MultipleActiveResultSets=True;
内容的提问来源于stack exchange,提问作者Bed_Ros
相关产品推荐
相关产品推荐

