【问题标题】:Entity Framework Association Performance实体框架关联性能
【发布时间】:2011-01-21 21:34:24
【问题描述】:

我有以下关联。GroupFile 与 MappedFolders 具有一对多关系(通过 MappedFolder 导航属性)。

我希望下一行进行更新:

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 集合是否已添加?

【问题讨论】:

  • 如果我使关联只能从 GroupFile -> MappedFolder 导航(即删除 MappedFolders 上的导航属性),那么它不需要这样做......跨度>

标签: entity-framework entity-framework-4


【解决方案1】:

您正在看到用于检索与此关联的实体的 select 语句:

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

在您调用ObjectContext.SaveChanges 之前,对groupFile.MappedFolder 的分配不会更新数据库。此时您应该会看到更新语句。

【讨论】:

  • 更新了我上面的问题。生成的 SQL 选择的是 GroupFiles 而不是 MappedFolders。它好像在添加之前检查它是否存在于子项中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多