首页 新闻 会员 周边

entityframework 连接未关闭。 连接的当前状态为正在连接。

0
悬赏园豆:30 [已解决问题] 解决于 2016-04-29 17:20

EF 的 database first 模式下。。  为什么会报这个错。。???

平常浏览网页没问题。。一快速 刷新网页,多次刷。就会宝这个错。。

如何判断。。当前状态是否连接。。

 

[InvalidOperationException: 连接未关闭。 连接的当前状态为正在连接。]
   System.Data.ProviderBase.DbConnectionClosedConnecting.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +1014478
   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +94
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +110
   System.Data.SqlClient.SqlConnection.Open() +96
   System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c) +10
   System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) +469
   System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext) +405
   System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2() +71
   System.Data.Entity.SqlServer.<>c__DisplayClass1.<Execute>b__0() +10
   System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Func`1 operation) +196
   System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) +82
   System.Data.Entity.Core.EntityClient.EntityConnection.Open() +271

[EntityException: 基础提供程序在 Open 上失败。]
   System.Data.Entity.Core.EntityClient.EntityConnection.Open() +339
混世小郎君的主页 混世小郎君 | 初学一级 | 园豆:143
提问于:2016-04-28 09:36
< >
分享
最佳答案
0

新手用ef.上下文一定要用using包起来一定要用using包起来一定要用using包起来 很重要所以说3遍.

收获园豆:30
吴瑞祥 | 高人七级 |园豆:29449 | 2016-04-28 09:57

谢谢。。我这个 框架 抄袭人家的

混世小郎君 | 园豆:143 (初学一级) | 2016-04-28 13:29

@混世小郎君: 不要尝试把上下文缓存起来.尤其是在web里.问题多到你无法想象.网上很多都是骗人的.作者根本没实际用过.我还写过博客骂过这些.你这个问题都属于可以正常解决的.还有很多问题是无法解决的.

不然项目上线你就惨了.我当时第一个项目就是这样用ef.上线后花了1个星期重写了数据访问层.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-04-28 13:38
其他回答(2)
1

 看看dbContext对象是不是运行时只有一份,估计是单例

waiter | 园豆:1000 (小虾三级) | 2016-04-28 09:49

你好。。我的dbcontext  是这样用的

public class BaseDAL where T : class { //创建公用的数据上下文 public CPEntities DbContext = EFContextFactory.GetCurrentDbContext(); public BaseDAL() { DbContext.Database.Initialize(false); DbContext.Configuration.ValidateOnSaveEnabled = false;//关闭Efedmx文件验证实体数据 } /// /// 批量提交,针对多个表的增删改查 /// /// public int SaveChanges() { return DbContext.SaveChanges();//返回受影响的行数 }

支持(0) 反对(0) 混世小郎君 | 园豆:143 (初学一级) | 2016-04-28 13:28

@混世小郎君: 这一看就是只用一个实例的情况。。

dbContext = new CPEntities();  //如果不存在上下文的话,创建一个EF上下文

所以并发的时候存在问题。 你换一个框架吧,或者每次new一个

支持(0) 反对(0) waiter | 园豆:1000 (小虾三级) | 2016-04-28 13:37
0

dbContext 尽量不要重复使用,用一次实例化一个

青楼满座 | 园豆:202 (菜鸟二级) | 2016-04-28 10:35


        public static CPEntities GetCurrentDbContext()
        {

            //CallContext:是线程内部唯一的独用的数据槽(一块内存空间)

            //传递DbContext进去获取实例的信息,在这里进行强制转换。

            CPEntities dbContext = CallContext.GetData("DbContext") as CPEntities;

            if (dbContext == null)  //线程在数据槽里面没有此上下文
            {
                dbContext = new CPEntities();  //如果不存在上下文的话,创建一个EF上下文

                //我们在创建一个,放到数据槽中去

                CallContext.SetData("DbContext", dbContext);

            }

            return dbContext;

        }

 

 

这样对嘛

支持(0) 反对(0) 混世小郎君 | 园豆:143 (初学一级) | 2016-04-28 13:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册