C#在MS SQL数据库调用堆栈中的应用

C#在MS SQL数据库调用堆栈中的应用,c#,winforms,entity-framework-4,C#,Winforms,Entity Framework 4,我继承了一个带有EFv4/.NET4.0的C#应用程序 通过使用SQL Server Profiler分析一些DB调用,我看到一些来自应用程序本身的意外数据库调用(这里没有其他用户、其他应用程序或进程混合) 在WinForm对话框中显示查询信息时,会触发对数据库的两个精确查询。(按照逻辑,我希望避免第二次呼叫……或者至少从哪里理解它) 第一个查询在表单的构造函数中触发,其中数据源绑定到DbContext.ClassToShow 但是第二个查询在显示此表单后的某个地方被触发(ShowDialog(

我继承了一个带有EFv4/.NET4.0的C#应用程序

通过使用SQL Server Profiler分析一些DB调用,我看到一些来自应用程序本身的意外数据库调用(这里没有其他用户、其他应用程序或进程混合)

在WinForm对话框中显示查询信息时,会触发对数据库的两个精确查询。(按照逻辑,我希望避免第二次呼叫……或者至少从哪里理解它)

第一个查询在表单的构造函数中触发,其中数据源绑定到DbContext.ClassToShow

但是第二个查询在显示此表单后的某个地方被触发(ShowDialog()。但我不知道具体在哪里

所以我的问题是:

为了在EntityFramework触发任何查询之前停止应用程序,我应该在哪里设置断点

我已尝试使用DbContext.ClassToShow属性,但它第一次就停止了

编辑:

我已尝试从以下位置更改绑定的分配方式:

siteBindingSource.DataSource=mDbContext.Site

致:

var sites=newlist();
var dbSites=mDbContext.Site;
地址范围(dbSites);
siteBindingSource.DataSource=站点

我还注意到,在VisualStudio中通过数据库实体进行搜索会触发数据库查询


仍然应用相同的问题,如何区分查询数据库的不同位置?

数据绑定系统似乎可以多次枚举数据源对象。每个枚举都会再次执行查询。实体框架查询对象不缓存其结果

因此,您必须具体化查询(例如,使用
ToList()


出于错误处理和事务管理的原因,这种方法更好。

您可以在实体的构造函数或属性设置器中进行设置。这是一个黑客,但它可能做的工作。否则,IntelliTrace不会捕获SQL查询的堆栈吗?我已经在entity属性上设置了一个断点,但它第一次被调用。根据您的模型设计,EF可能正在进行延迟加载,您的站点实体是否与其他实体有任何关系?在这种情况下,它没有关系,因为表格应基本上显示“站点”数据库表。即使是惰性负载,为什么还要向数据库查询两次?请尝试IntelliTrace。默认情况下,它记录SQL查询。顺便说一句,您所做的更改(编辑)。。。这改变了什么吗?实际上,您应该绑定到列表,而不是查询。查询对象不会缓存其结果。此外,还有一个很好的答案,即每个SQL查询的IntelliTrace点的确切代码行位置:)(即使很遗憾,只有VS Enterprise可以做到这一点!)