Entity Framework Association Performance - PullRequest
0 голосов
/ 22 января 2011

У меня есть следующая связь. GroupFile имеет отношение один ко многим с MappedFolders (через свойство навигации MappedFolder).

alt text

Я ожидаю, что следующая строка будет обновлять:

groupFile.MappedFolder = _mappedFoldersRepository.Query(m => m.FolderName == "Unassigned").FirstOrDefault();

Запрос (согласно профилировщику) выполняет этот SQL:

SELECT TOP ( 1 ) [Extent1].[MappedFolderId] AS [MappedFolderId],
                 [Extent1].[FolderPath]     AS [FolderPath],
                 [Extent1].[FolderName]     AS [FolderName],
                 [Extent1].[HotFolder]      AS [HotFolder],
                 [Extent1].[Workstation]    AS [Workstation]
FROM   [dbo].[MappedFolders] AS [Extent1]
WHERE  N'Unassigned' = [Extent1].[FolderName]

Но, согласно Entity Framework Profiler, само назначение выполняет этот оператор SQL до начала транзакции:

SELECT [Extent1].[Id]                          AS [Id],
       [Extent1].[Path]                        AS [Path],
       [Extent1].[Status]                      AS [Status],
       [Extent1].[DateAdded]                   AS [DateAdded],
       [Extent1].[DateLastUpdated]             AS [DateLastUpdated],
       [Extent1].[JobSetup_SetupId]            AS [JobSetup_SetupId],
       [Extent1].[Group_GroupId]               AS [Group_GroupId],
       [Extent1].[MappedFolder_MappedFolderId] AS [MappedFolder_MappedFolderId]
FROM   [dbo].[GroupFiles] AS [Extent1]
WHERE  [Extent1].[MappedFolder_MappedFolderId] = 7 /* @EntityKeyValue1 */

Я, должно быть, упускаю что-то тонкое (или не очень тонкое), но я не уверен, зачем нужен этот оператор SQL .... ОБНОВИТЬ: Рассматривая далее то, что говорит мне профилировщик, оператор SQL связан со следующим:

public virtual MappedFolders MappedFolder
{
    get { return _mappedFolder; }
    set
    {
        if (!ReferenceEquals(_mappedFolder, value))
        {
            var previousValue = _mappedFolder;
            _mappedFolder = value;
            FixupMappedFolder(previousValue);
        }
    }
}


private void FixupMappedFolder(MappedFolders previousValue)
{
    if (previousValue != null && previousValue.GroupFiles.Contains(this))
    {
        previousValue.GroupFiles.Remove(this);
    }

    if (MappedFolder != null)
    {   
        // THIS IS WHAT THE SQL STATEMENT IS FOR!!!!!
        if (!MappedFolder.GroupFiles.Contains(this))
        {
            MappedFolder.GroupFiles.Add(this);
        }
    }
}

Сгенерированный код проверяет коллекцию GroupFiles сопоставленной папки, чтобы определить, была ли она уже добавлена?

1 Ответ

0 голосов
/ 22 января 2011

Вы видите оператор выбора, используемый для извлечения сущности, связанной с этим:

_mappedFoldersRepository.Query(m => m.FolderName == "Unassigned").FirstOrDefault();

Присвоение groupFile.MappedFolder не обновляет базу данных, пока вы не вызовете ObjectContext.SaveChanges.В этот момент вы должны увидеть оператор обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...