【问题标题】:Entity Framework 4.0 - The underlying provider failed on OpenEntity Framework 4.0 - 底层提供程序在打开时失败
【发布时间】:2012-09-25 11:20:56
【问题描述】:

我们有一个使用 Entity Framework 4.0 的 Web 应用程序。不幸的是,当大量用户点击应用程序时,EF 会抛出错误 底层提供程序在打开时失败

下面是sn-p的代码:

//DAL
public IQueryable<EmployeeEntity> GetEmployeeDetail()
{
    DatabaseEntities ent = new DatabaseEntities(this._connectionString);
    IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity
                                           select employee;

    return result;
}

请注意上面的代码返回 IQuerable。

  1. 上述模式有什么问题会导致异常发生吗?
  2. Entity Framework 何时以及如何确定关闭/打开数据库连接以及保留多长时间?
  3. 在什么情况下会出现上述错误?
  4. EF 连接池的最大数量是多少,如何配置?
  5. 我们是否需要明确指定打开和关闭
  6. 下面的代码是解决上述问题的最佳方法吗?

public IQueryable<EmployeeEntity> GetEmployeeDetail()
{
    using (DatabaseEntities ent = new DatabaseEntities(this._connectionString))
    {
        IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity 
                                            select employee;                     
        return result.ToList().AsQuerable();
    }
}

【问题讨论】:

  • 是否有特定原因返回IQueryable&lt;T&gt; 而不是IEnumerable&lt;T&gt;
  • @RePierre,感谢您的回复。 IT 现有代码,无法更新。无论如何,会有什么区别?
  • 区别就在这里stackoverflow.com/a/2876655/844006。我之所以问,是因为我认为如果您将实体容器包装在 using 语句中并将结果公开为 IQueryable&lt;T&gt;,您会遇到一些问题;稍后有人可能会执行GetEmployeeDetail().Where(e=&gt;e.Id == id) 之类的操作,并且执行该查询可能会出现一些问题,因为数据上下文对象将被释放。
  • 如果有人做了 GetEmployeeDetail().Where(e=>e.Id == id) 那么结果将在内存中可用。这就是 ToList().AsQuerable() 的全部目的

标签: entity-framework c#-4.0 linq-to-sql


【解决方案1】:

ToList() 调用将导致查询立即在数据库上运行,因为它没有以任何方式过滤将返回数据库中的每个员工。这可能会导致您出现性能问题。

但是,您不能在您的情况下删除它,因为如果您直接返回 IQueryable,那么在您尝试获取结果时上下文将被释放。

你可以:

  • 改变它的工作方式,使ent 的范围在方法返回时不会结束,并在不调用ToList() 的情况下返回查询。然后,您可以在调用ToList() 之前进一步过滤IQueryable
  • 在方法中调用ToList(),但首先过滤/限制查询(例如,将一些参数传递给方法来指定)以减少从数据库返回的行数。

【讨论】:

  • ToList() 将如何导致性能和过滤问题。因为数据将存储在内存中。
  • 它可能会导致每次调用时从数据库中检索 10s/100s/1000s 的员工,如果您稍后过滤列表,则可能没有必要
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多