在WinForms中处置实体DbContext

在WinForms中处置实体DbContext,winforms,entity-framework,entity-framework-6,Winforms,Entity Framework,Entity Framework 6,在Windows窗体应用程序中,窗体启动时,将从数据库加载数据。它首先进入持久化数据层并创建新的DBContext public DataEntities DBContext=new DataEntities() 在此之后,它加载数据 我在表单关闭事件上处理DBContext。原因是我使用DBContext的本地属性来查询数据。所以它在加载后查询内存数据,而不是好(快)的数据库。 另一件事是,只有启动程序的用户才能访问自己的数据(而不是其他用户的数据)。因此,任何人修改其数据的可能性都很小(只有

在Windows窗体应用程序中,窗体启动时,将从数据库加载数据。它首先进入持久化数据层并创建新的DBContext

public DataEntities DBContext=new DataEntities()

在此之后,它加载数据

我在表单关闭事件上处理DBContext。原因是我使用DBContext的本地属性来查询数据。所以它在加载后查询内存数据,而不是好(快)的数据库。 另一件事是,只有启动程序的用户才能访问自己的数据(而不是其他用户的数据)。因此,任何人修改其数据的可能性都很小(只有他的副手)

所以,在表单关闭之前,不会释放DBContext

注1:此表格用于输入数据。它不是主要形式。在主窗体上,我将立即处理它,因为主窗体仅用于查看数据

注2:应用将在本地网络中使用,用户数量约为40

注3:我使用实体框架6.1.3

在开始加载数据后,在sql profiler中,我注意到sql命令被调用:

exec sp_reset_connection
我的问题是:
当表单关闭时(在表单关闭事件中),我是否可以使用这种方法处理DBContext

当您的DbContext有很长的生存期时,以下是一些注意事项(连接的实体):

  • 从SQL Server检索到的每个实体都将加载到一级缓存中的内存中(RAM使用)

  • 如果数据从其他DbContext更改,则可能会出现一些并发性问题

  • 如果您的SQL Server事务隔离级别为READ UNCOMMITTED,则可能会得到脏读

  • 如果您在DbContext中加载了很多实体(数千个),那么应用程序通常会比较慢,并且在尝试更改实体时可能会遇到性能问题,因为EF必须跟踪所有实体

  • 当然可以。这被称为连接场景,即上下文与数据库保持“连接”(注意引号),您保存的实体与从数据库抓取的实体相同

    在像Windows窗体应用程序这样的富客户端应用程序中,这是相对较短的编辑对话框窗口的常见模式。这正是你在这里做的

    上下文实际上并不保持与数据库的开放连接。它会在每次数据库交互后关闭连接,因此会记录Sql事件探查器日志


    要考虑的一件事。即使用户几乎不可能同时编辑相同的数据,也建议引入。EF使这相对容易。

    因为如果我使用using block,我将无法使用DBContext的本地属性,因为它将被释放。它将改变我编写的Save、Add、Delete操作的逻辑。通常,您必须尽可能缩短DbContext的生命周期,以避免大量并发和缓存问题。但是在你的使用中,你可以像那样毫无问题地使用它。我的建议是,只要您的视图处于打开状态,就保持DbContext处于打开状态。例如,在winform中,如果您有一个选项卡或mainForm,则在切换选项卡选项卡时,生成DbContext并使其保持活动状态,只要此视图alive@Bassam阿鲁吉利,谢谢。我也希望我能在正式比赛中处理它。在主窗体上,由于主窗体将长时间保持打开状态,我会立即将其处理。但是这个子表单用于保存、编辑、删除操作,所以我可以这样使用它。此外,用户只能访问其数据,所以其他人无法读取和显示其数据,这将防止“由于有人持有记录而无法保存”。另一件事是,我不明白DBContext保持打开状态时会发生什么,sql server中会发生什么。本文将更详细地解释这种方法的好处是实体框架跟踪更改。所以,若您并没有做任何更改,并单击“保存”按钮,它将不会发送更新查询,因为并没有要保存的内容。实体框架跟踪需要保存的内容。但如果您处理dbcontext,那么我不确定它是否会发送大型更新查询。