【问题标题】:SQL Server Profiler do not trace all Entity Framework 4 queries - issueSQL Server Profiler 不跟踪所有 Entity Framework 4 查询 - 问题
【发布时间】:2011-12-14 02:53:10
【问题描述】:

我正在阅读Programming Entity Framework, 2nd Edition,在第一章中有一个非常简单的查询:

    private static void QueryContacts()
    {
        using (var context = new SampleEntities())
        {
            var contacts = context.Contacts.Where(c => c.FirstName == "Robert");
            var res = (contacts as ObjectQuery<Contact>).Execute(MergeOption.NoTracking);

            foreach (var contact in res)
            {
                foreach (var address in contact.Addresses)
                {
                    Console.WriteLine("\t{0}", address.City);
                }
            }
        }
        Console.Write("Press Enter...");
        Console.ReadLine();
    }

当我将 SQL 分析器附加到数据库实例时,我可以看到执行了以下 SQL:

SELECT 
[Extent1].[ContactID] AS [ContactID], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[Title] AS [Title], 
[Extent1].[AddDate] AS [AddDate], 
[Extent1].[ModifiedDate] AS [ModifiedDate]
FROM [dbo].[Contact] AS [Extent1]
WHERE N'Robert' = [Extent1].[FirstName]

但没有查询地址表的迹象(即使有地址)。

当我附加 Entity Framework Profiler 时,我可以看到两者:

SELECT [Extent1].[ContactID]    AS [ContactID],
       [Extent1].[FirstName]    AS [FirstName],
       [Extent1].[LastName]     AS [LastName],
       [Extent1].[Title]        AS [Title],
       [Extent1].[AddDate]      AS [AddDate],
       [Extent1].[ModifiedDate] AS [ModifiedDate]
FROM   [dbo].[Contact] AS [Extent1]
WHERE  N'Robert' = [Extent1].[FirstName]

SELECT [Extent1].[addressID]     AS [addressID],
       [Extent1].[Street1]       AS [Street1],
       [Extent1].[Street2]       AS [Street2],
       [Extent1].[City]          AS [City],
       [Extent1].[StateProvince] AS [StateProvince],
       [Extent1].[CountryRegion] AS [CountryRegion],
       [Extent1].[PostalCode]    AS [PostalCode],
       [Extent1].[AddressType]   AS [AddressType],
       [Extent1].[ContactID]     AS [ContactID],
       [Extent1].[ModifiedDate]  AS [ModifiedDate]
FROM   [dbo].[Address] AS [Extent1]
WHERE  [Extent1].[ContactID] = 209 /* @EntityKeyValue1 */

您知道 SQL Server Profiler 发生了什么,因此无法捕获对地址表的查询吗?

谢谢

【问题讨论】:

  • 确保您没有在 SQL 分析器中设置任何过滤器。

标签: .net linq sql-server-2008 entity-framework


【解决方案1】:

宾果游戏!

我选择了所有事件类型,结果发现 Addresses 查询可追踪为 RPC:Completed,而 Contact 可追踪为 SQL:BatchCompleted:

exec sp_executesql N'SELECT 
[Extent1].[addressID] AS [addressID], 
[Extent1].[Street1] AS [Street1], 
[Extent1].[Street2] AS [Street2], 
[Extent1].[City] AS [City], 
[Extent1].[StateProvince] AS [StateProvince], 
[Extent1].[CountryRegion] AS [CountryRegion], 
[Extent1].[PostalCode] AS [PostalCode], 
[Extent1].[AddressType] AS [AddressType], 
[Extent1].[ContactID] AS [ContactID], 
[Extent1].[ModifiedDate] AS [ModifiedDate]
FROM [dbo].[Address] AS [Extent1]
WHERE [Extent1].[ContactID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=220

【讨论】:

  • 为什么 [某些] 查询是通过 RPC 和 sp_execsql 执行的? :>
【解决方案2】:

在你的循环中延迟加载期间会查询地址。使用联系人单次拍摄会更有效。为此,您需要:

var res = (contacts as ObjectQuery<Contact>).Include("Addresses").Execute(MergeOption.NoTracking);

【讨论】:

  • 嗨,我推断地址是延迟加载的,但我没有在 EF4 中控制该功能。这就是我首先启动 SQL Server Profiler 的原因,看看它是如何处理地址的。
  • 所以如果你在调试器中遍历你的循环 Profiler 仍然没有捕捉到任何东西?如果是这样,那么它肯定与过滤器有关。另一个可能的原因 - 具有此 ID 的联系人已在 Context 中具体化,并且其地址也已加载。在这种情况下,您将从 Context 获取您的地址,而无需查询 DB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2011-08-19
  • 2017-04-15
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多