.net - Entity Framework - 保持数据库上下文打开与不断重新创建

标签 .net vb.net entity-framework

我有一个相当简单的 Winforms/Entity Framework (v6) 程序:

  • 查询数据库以填充表单元素
  • 用户点击后,重新查询数据库获取相关信息
  • 对该信息执行计算并将其显示给用户

  • 作为 EF 新手,我尝试遵循我在网上找到的示例,并提出了一些非常简单的用于填充/查询的方法:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Using ctx As New MyEntities
                <Query DB to populate initial values for first combobox>
        End Using
    End Sub
    
    Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
        Using ctx As New MyEntities
             <Queries to populate the other controls based upon user selections>
         End Using
    End Sub
    
    Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
         Using ctx As New MyEntities
             <Queries to get data, based upon user selections for calculations>
         End Using
    End Sub
    

    我发现的是似乎减慢了我的程序的部分(和 如果我错了,请纠正我 - 正如我所说,我是新手)我是每次使用时都重新建立一个新的数据库连接:
    Using ctx As New MyEntities
        ...
    End Using
    

    在我的代码中。

    所以,我正在考虑做的是有一个表单级变量 ctx as MyEntities - 在表单加载时建立连接并在表单关闭时关闭连接并始终使用相同的连接......大致如下:

    Dim ctx as MyEntities
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ctx = New MyEntities
    
        <Query ctx to populate initial values for first combobox>
    End Sub
    
    Private Sub cboVal1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVal1.SelectedIndexChanged
        <Queries ctx to populate the other controls based upon user selections>
    End Sub
    
    Private Sub Button_Press(sender As Object, e As EventArgs) Handles MyButton.Click
         <Queries ctx to get data, based upon user selections for calculations>
    End Sub
    
    Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ctx.Dispose()
        ctx = Nothing
    End Sub
    

    当我以这种方式切换工作时,它似乎大大提高了速度,我知道这让我有可能对数据库进行错误更改,但这是一个没有任何作用的小项目更新 - 只是查询......这是一个合理的解决方案还是这是一种危险的做事方式?

    最佳答案

    几乎所有现代查询工具都会将数据库连接汇集到一个连接池中。这看起来很像线程池;将打开一定数量的连接,并且每当创建新上下文并请求连接时,它将独占使用现有连接之一。当上下文被处理时,连接不会被关闭,它只会返回到连接池。

    因此,无需尝试手动使上下文长时间保持事件状态。仅将它们用于单个操作。

    当然,如果您明确不希望它发生,则可以禁用连接池,但很少有理由这样做。

    关于.net - Entity Framework - 保持数据库上下文打开与不断重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25550473/

    相关文章:

    c# - 服务器端的计时器?

    .net - 部署 .NET WinForms 应用程序的最恶劣的企业环境是什么?

    c# - 条形码(代码 39)生成

    .net - XAML&WPF中如何实现可分离控件

    vb.net - 遍历列表的副本,仍然得到InvalidOperationException

    vb.net - 关闭表单后获取 ObjectDispose 异常

    mysql - 使用列表时出现错误的 Fluent NHibernate Schema 输出

    c# - 在 EF6 和 ASP.NET 中同时使用多个 DbContext 实例

    entity-framework - 如何针对与子列表一起使用的 Entity Framework 编写通用的 WebAPI Put 方法?

    asp.net - (0..1---*) 在实体关系图/实体数据模型 (.edmx) 中是什么意思