Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架、DBContext和;基础提供程序在打开时失败";握手次数多_Entity Framework_Sql Server Express_Dbcontext_Connection Timeout - Fatal编程技术网

Entity framework 实体框架、DBContext和;基础提供程序在打开时失败";握手次数多

Entity framework 实体框架、DBContext和;基础提供程序在打开时失败";握手次数多,entity-framework,sql-server-express,dbcontext,connection-timeout,Entity Framework,Sql Server Express,Dbcontext,Connection Timeout,我偶尔抛出System.Data.EntityException。异常表示连接时握手时间很长。例外信息为: System.Data.EntityException:基础提供程序在打开时失败。-->System.Data.SqlClient.SqlException:连接超时已过期。登录后阶段经过的超时时间。连接可能在等待服务器完成登录过程并响应时超时;或者,它可能在尝试创建多个活动连接时超时。尝试连接到此服务器的持续时间为-[预登录]初始化=40;握手=25118;[登录]初始化=0;认证=0;

我偶尔抛出System.Data.EntityException。异常表示连接时握手时间很长。例外信息为:

System.Data.EntityException:基础提供程序在打开时失败。-->System.Data.SqlClient.SqlException:连接超时已过期。登录后阶段经过的超时时间。连接可能在等待服务器完成登录过程并响应时超时;或者,它可能在尝试创建多个活动连接时超时。尝试连接到此服务器的持续时间为-[预登录]初始化=40;握手=25118;[登录]初始化=0;认证=0;[登录后]完成=4384;-->System.ComponentModel.Win32异常:等待操作超时

请注意,“握手”阶段为25.118秒。考虑到连接和命令超时仅为30,出现问题也就不足为奇了。我的问题是

  • 这可能是什么原因造成的
  • 当一切正常运行时,有没有办法监控连接时间?为了缩小问题的范围,我想知道连接是否总是需要很长时间,或者连接是否通常非常快,并且出于某种原因,有时需要30秒以上。这可能会提供一些线索
  • 我不想只增加连接/命令超时而不知道更多。我已经读到可以使用连接池,如果有理由,我当然愿意尝试。我们正在使用的数据库是SQL Express,代码没有在上下文上调用dispose,但我了解到这并不是严格必需的(示例:)。事实上,代码非常相似。我们有这样一个班:

    public class MyContext : DbContext
    {
       public MyContext (string dbName, bool setInitializer = true)
            : base(dbName)
        {
            if (setInitializer)
            {
                Database.SetInitializer(new MyContextInitializer());
    
                // Set timeout (based on code from http://stackoverflow.com/questions/6232633/entity-framework-timeouts)
                var adapter = (IObjectContextAdapter) this;
                var objectContext = adapter.ObjectContext;
                objectContext.CommandTimeout = CommandTimeoutSeconds;
            }
        } 
    
        public DbSet<FuelReading> FuelReadings {get; set;}
    }
    
    internal class MyContextInitializer : DropCreateDatabaseIfModelChanges<MyContext>
    {
        /// <summary>
        /// Adds initial values to the db on db creation.
        /// </summary>
        /// <param name="context"></param>
        protected override void Seed(MyContext context)
        {
            // Seed 
            // TODO: Remove this seeding if we upgrade to .NET 4.5 (Entity Framework 5 has enum support on .NET 4.5)
            var fuelReading= new fuelReading {Name = "Unknown"};
    
    
            context.FuelReadings.Add(fuelReading);
    
    
            base.Seed(context);
        }
    }
    
    但我强调,它也出现在其他地方

    我可以提供更多的相关细节吗?有人有什么想法吗


    更新。根据评论和朋友的建议,我开始关注PerfMon。通常,“连接重置/秒”通过屋顶(至300)。我在这个柜台上找不到太多的信息。从表面上看,这是连接在一秒钟内重置的次数。这是否意味着尝试或建立了大量连接?我不确定为什么这个数字会如此之高,因为我认为(代码是继承的)数据库(SQLServerExpress)只是写入到对象中。这些对象都是使用LINQ读取、操作、写入等的,但我认为在非常重要的DbContext.SaveChanges(…)出现之前,dB不会再发生任何事情,所以我不确定这个计数器告诉了我什么。然而,如果它确实反映了大量的联系,那么它可能是一条关于发生了什么的重要线索。可能我没有连接或类似的东西?

    时间太长了,数据库是位于同一台计算机上,还是位于远程网络?同一台计算机上。谢谢,Davethere我们有很多方法来检查。。。若查询触发到sql,那个么使用ef中的日志扩展方法,使用类似于Spile的工具,其中一个来自stackoverflow(我忘了名字),使用块中的查询语句来处理上下文。。确保连接字符串是正确的:)您可以共享您的anonimized连接字符串吗?它使用的是IP地址、netbios名称还是完全合格的域名?那个盒子域名加入了吗?启用了哪些协议?rene,连接字符串是:并且在DbContext派生类的构造函数中,我有:Database.SetInitializer(新的ModalityDataContextInitializer());var adapter=(IObjectContextAdapter)这个;var objectContext=adapter.objectContext;objectContext.CommandTimeout=30;
    FuelReading reading= (from tz in _dbContext.FuelReadings
                                             where
                                                 tz.Id ==
                                                 3
                                             select tz).FirstOrDefault();