2011-01-21 7 views
0

J'ai l'association suivante .. GroupFile a une relation un à plusieurs avec MappedFolders (via la propriété de navigation MappedFolder).Entity Framework Association Performance

alt text

je me attends à la ligne suivante de faire une mise à jour:

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

La requête (selon le profileur) exécute ce 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] 

Mais selon Entity Framework Profiler, l'affectation elle-même exécute cette instruction SQL avant de commencer la transaction:

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 */ 

Je dois manquer quelque chose de subtil (ou pas si subtile) mais je ne sais pas pourquoi cette déclaration SQL est nécessaire .... MISE À JOUR: À plus ce que le profileur me dit, SQL déclaration est associée à ce qui suit:

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); 
     } 
    } 
} 

le code généré vérifie la collection GroupFiles du dossier mappé pour voir si elle a déjà été ajouté?

+0

Si je fais en sorte que l'association navigue UNIQUEMENT à partir de GroupFile -> MappedFolder (ie, supprime la propriété de navigation sur MappedFolders), alors elle n'a pas besoin de faire cela .... –

Répondre

0

Vous voyez l'instruction select utilisé pour récupérer l'entité associée à ceci:

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

L'affectation à groupFile.MappedFolder ne met pas à jour la base de données jusqu'à ce que vous appelez ObjectContext.SaveChanges. À ce stade, vous devriez voir l'instruction de mise à jour.

+0

Mis à jour ma question ci-dessus. Le SQL Généré sélectionne GroupFiles et non MappedFolders. C'est comme s'il vérifiait s'il existait dans les enfants avant de l'ajouter ... –

Questions connexes