在WinForms中释放实体DbContext

wqlqzqxt  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(140)

在Windows窗体应用程序中,当窗体启动时,它从数据库加载数据它首先转到Persistence Data层并创建新DBContext
public DataEntities DBContext = new DataEntities();
之后,它将加载数据。
我在窗体关闭事件上部署了DBContext,原因是我使用了DBContext的Local属性来查询数据,所以加载后查询的是内存数据,而不是数据库,这样比较好(快),另外一个原因是只有启动程序的用户才能访问自己的数据(而不是其他用户的数据),所以任何人都很少有机会修改自己的数据(只有他的副手)。
因此,在关闭窗体之前不会释放DBContext。
注1:这是输入数据的窗体,不是主窗体,在主窗体上我会立即处理它,因为主窗体只是用来查看数据的。
注2:应用将在本地网络中使用,用户数约为40。
6.1.3我使用实体框架注3:
在开始时加载数据后,在sql profiler中,我注意到sql命令被调用:

exec sp_reset_connection

我的问题是:我可以使用这种方法并在表单关闭时(在表单关闭事件上)释放DBContext吗?

suzh9iv8

suzh9iv81#

当DbContext的存留时间较长时,请注意下列事项(已连接的实体):

  • 从SQL Server检索到的每个实体都将加载到一级缓存(RAM USAGE)的内存中。
  • 如果从其他DbContext更改了数据,则可能会遇到一些并发问题。
  • 如果您的SQL Server事务隔离级别为READ UNCOMMITTED,则可能会得到脏读。
  • 如果在DbContext中加载了大量实体(数以千计),则应用程序通常会变慢,并且在尝试更改实体时可能会出现性能问题,因为EF必须跟踪所有实体。
hgb9j2n6

hgb9j2n62#

当然。这就是所谓的“连接场景”,即上下文与数据库保持“连接”(注意引号),并且保存从数据库中获取的相同实体。
在像Windows窗体应用程序这样的富客户端应用程序中,这是相对较短的编辑对话框窗口的常见模式。
上下文实际上并不保持与数据库的打开连接。它在每次数据库交互后关闭连接,因此SQL事件探查器记录。
有一点需要考虑。尽管用户同时编辑相同数据的可能性很小,但还是建议引入optimistic concurrency control。EF使这一点相对容易。

相关问题