2011-01-21 3 views
0

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

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 .... UPDATE: Заглядывая в то, что профайлер говорит мне, то 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 отображенных папку, чтобы увидеть, если он уже был добавлен?

+0

Если я делаю это так, что ассоциация является навигационной ТОЛЬКО от GroupFile -> MappedFolder (т. Е. Удаляет свойство навигации в MappedFolders), тогда это не нужно делать .... –

ответ

0

Вы видите ЗЕЬЕСТ используется для извлечения сущности, связанной с этим:

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

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

+0

Обновлен мой вопрос выше. SQL Generated выбирает GroupFiles, а не MappedFolders. Он как бы проверяет, существует ли он у детей, прежде чем добавлять его ... –

Смежные вопросы