2011-01-21 105 views
0

我有以下关联.. 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] 

但根据实体框架分析器,分配本身在开始事务之前执行此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上的导航属性)导航关联,那么它不需要那样做。 – 2011-01-22 01:02:51

回答

0

你看到用于检索与此相关的实体select语句:

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

,直到调用ObjectContext.SaveChanges分配给groupFile.MappedFolder不更新数据库。此时你应该看到更新声明。

+0

更新了我上面的问题。生成的SQL是选择GroupFiles而不是MappedFolders ..就好像在添加它之前检查它是否存在于子项中一样... – 2011-01-22 00:41:40