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
新手用ef.上下文一定要用using包起来一定要用using包起来一定要用using包起来 很重要所以说3遍.
谢谢。。我这个 框架 抄袭人家的
@混世小郎君: 不要尝试把上下文缓存起来.尤其是在web里.问题多到你无法想象.网上很多都是骗人的.作者根本没实际用过.我还写过博客骂过这些.你这个问题都属于可以正常解决的.还有很多问题是无法解决的.
不然项目上线你就惨了.我当时第一个项目就是这样用ef.上线后花了1个星期重写了数据访问层.
看看dbContext对象是不是运行时只有一份,估计是单例
你好。。我的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();//返回受影响的行数 }
@混世小郎君: 这一看就是只用一个实例的情况。。
dbContext = new CPEntities(); //如果不存在上下文的话,创建一个EF上下文
所以并发的时候存在问题。 你换一个框架吧,或者每次new一个
dbContext 尽量不要重复使用,用一次实例化一个
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;
}
这样对嘛