【发布时间】: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