在WinForms中配置实体DbContext

时间:2016-06-17 14:34:17

标签: winforms entity-framework entity-framework-6

在Windows窗体应用程序中,当窗体启动时,它会从数据库加载数据。它首先转到持久性数据层并创建新的DBContext。

public DataEntities DBContext = new DataEntities();

之后加载数据。

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

因此,在表单关闭之前不会释放DBContext。

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

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

注3:我使用实体框架6.1.3

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

exec sp_reset_connection

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

2 个答案:

答案 0 :(得分:1)

当你的DbContext有很长的实时时间时,这里有一些考虑因素(连接的实体):

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

  • 如果数据从其他DbContext更改,您可能会遇到一些并发问题。

  • 如果您的SQL Server TRANSACTION ISOLATION LEVEL是READ UNCOMMITTED,那么您可能会收到脏读。

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

答案 1 :(得分:1)

不确定。这称为连接方案,即上下文与数据库保持“连接”(注意引号),并保存从数据库中获取的相同实体。

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

上下文实际上并不保持与数据库的开放连接。它在每次数据库交互后关闭连接,因此Sql Profiler记录。

有一点需要考虑。即使用户同时编辑相同数据的可能性很小,也可能建议引入optimistic concurrency control。 EF使这相对容易。