J'ai l'association suivante .. GroupFile a une relation un à plusieurs avec MappedFolders (via la propriété de navigation MappedFolder).Entity Framework Association Performance
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é?
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 .... –