【问题标题】:Is Entity Framework 6.0 DBContex automatically closing?Entity Framework 6.0 DBContext 会自动关闭吗?
【发布时间】:2019-09-27 09:26:48
【问题描述】:

DBcontext 连接会自动关闭吗?我使用了 EF6 并且没有打开或关闭连接,因为上下文与配置文件中的连接字符串绑定。 EF 存储过程已连接并可进行事务处理。

Asp.net 项目

{ ... 返回 DBContext.ValidUserName(userName).SingleOrDefault(); }

想弄清楚连接是自动关闭还是必须手动关闭?这是导致 IIS 中超出池的原因吗?

【问题讨论】:

  • 如果上下文没有被释放,很可能不会。

标签: c# entity-framework entity-framework-6 iis-7 dbcontext


【解决方案1】:

这取决于您如何使用它,并且您在问题中没有提供太多信息。但简短的回答是 Entity 框架为您管理连接,您通常不必担心手动打开或关闭连接。

来自微软文档:

对象服务通过 Connection 属性公开 EntityConnection。这使您能够管理连接和事务或提供您自己的EntityConnection。当您希望在短期对象上下文中保持打开连接以提高性能或显式控制事务时,这很有用。 Entity Framework 使用的相同提供者连接可以与应用程序的其他部分共享。

管理连接时需要考虑以下注意事项:

  • 如果在操作之前对象上下文尚未打开,则对象上下文将打开连接。如果对象上下文在操作过程中打开了连接,它总是会在操作完成时关闭连接。

  • 如果你手动打开连接,对象上下文不会关闭它。调用 Close 或 Dispose 将关闭连接。

  • 如果对象上下文创建了连接,那么在释放上下文时连接总是会被释放。

  • 在长期运行的对象上下文中,您必须确保在不再需要上下文时将其释放。

  • 如果你为对象上下文提供了一个开放的EntityConnection,你必须确保它被释放。

【讨论】:

  • 在这种情况下没有手动绑定,连接在EF初始化时给出。问题是 IIS 池超出。这是 EF6 上下文。
【解决方案2】:

From the docs:

默认情况下,上下文管理与数据库的连接。上下文根据需要打开和关闭连接。
例如,上下文打开连接以执行查询,然后在处理完所有结果集后关闭连接。

当您在 Web 应用程序中使用 DbContext 时,您也应该考虑 Lifetime 部分: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/working-with-dbcontext#lifetime

这里有一些在决定生命周期时的一般准则 上下文:

  • 使用 Web 应用程序时,为每个请求使用一个上下文实例。
  • 使用 Windows Presentation Foundation (WPF) 或 Windows 窗体时,请为每个窗体使用一个上下文实例。这使您可以使用 上下文提供的更改跟踪功能。
  • 如果上下文实例是由依赖注入容器创建的,通常由容器负责 处置上下文。
  • 如果上下文是在应用程序代码中创建的,请记住在不再需要上下文时将其丢弃。
  • 使用长时间运行的上下文时,请考虑以下事项:
    • 当您将更多对象及其引用加载到内存中时,上下文的内存消耗可能会迅速增加。这可能会导致 性能问题。
    • 上下文不是线程安全的,因此不应在同时处理它的多个线程之间共享。
    • 如果异常导致上下文处于不可恢复状态,则整个应用程序可能会终止。
    • 遇到与并发相关的问题的机会随着查询和更新数据的时间间隔而增加 增长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多