SQL Server Profiler не отслеживает все запросы Entity Framework 4 - проблема - PullRequest
3 голосов
/ 13 декабря 2011

Я читаю Программирование Entity Framework, 2-е издание , и в первой главе есть очень простой запрос:

    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 Profiler к экземпляру базы данных, я вижу, что был выполнен следующий 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, чтобы он не перехватывал запросы к таблице адресов?

Спасибо

Ответы [ 2 ]

8 голосов
/ 13 декабря 2011

Бинго!

Я выбрал все типы событий, и оказалось, что запрос адресов можно было отследить как RPC: завершен, тогда как контакт можно было отследить как 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
0 голосов
/ 13 декабря 2011

Адреса запрашиваются при ленивой загрузке внутри вашей петли.Это будет более эффективно, чтобы получить их в одиночной съемке с контактами.Для этого вам понадобится:

var res = (contacts as ObjectQuery<Contact>).Include("Addresses").Execute(MergeOption.NoTracking);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...