2011-01-21 9 views
0

私は以下の関連付けを持っています。GroupFileは、(MappedFolderナビゲーションプロパティを使用して)MappedFoldersと1対多の関係を持っています。エンティティフレームワークアソシエーションのパフォーマンス

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] 

をそれに応じて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文が必要な理由私はわからないんだけど.... 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のナビゲーションプロパティを削除する)からのアソシエーションのみがナビゲーションになるようにすると、その必要はありません。 –

答えて

0

あなたはこれに関連するエンティティを取得するために使用するselect文見ている:あなたはObjectContext.SaveChangesを呼び出すまで

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

割り当てgroupFile.MappedFolderには、データベースを更新しません。その時点で、更新ステートメントが表示されます。

+0

上記の質問を更新しました。生成されたSQLは、MappedFoldersではなくGroupFilesを選択しています。その子を追加する前にそれが存在するかどうかを確認する場合 –

関連する問題