これが私のシナリオです:
public class Contact
{
public Guid ContactId { get; set; }
........
public Guid WorkspaceId { get; set; }
public Workspace Workspace { get; set; }
}
public class Workspace
{
public Guid WorkspaceId { get; set; }
........
public ICollection<Contact> ReferencedContacts { get; set; }
public ICollection<Contact> OwnedContacts { get; set; }
}
ロジックは次のとおりです。連絡先はワークスペース外に存在できません (ワークスペースが連絡先を所有していることを意味します)。ユーザーにはワークスペースがあり、そこに「所有されている連絡先」が配置されます (所有されている連絡先 = 職業、名前、住所などのユーザーを説明する連絡先情報)。また、ユーザー ワークスペースは、他のユーザーが所有する連絡先への参照を保持できます (ここに、ワークスペースと参照先の連絡先との関係を格納する結合テーブルがあります)。
public WorkspaceMap()
{
....
HasMany(w => w.ReferencedContacts).WithMany().Map(mp =>
{
mp.ToTable("WorkspaceReferencedContacts");
mp.MapLeftKey("WorkspaceId");
mp.MapRightKey("ContactId");
});
}
public ContactMap()
{
......
HasRequired(c => c.Workspace).WithMany(w => w.OwnedContacts).HasForeignKey(c => c.WorkspaceId).WillCascadeOnDelete(false);
Property(c => c.WorkspaceId).HasColumnName("WorkpaceId");
}
私がやろうとしているのは、クエリ メソッドを使用して、特定のワークスペースで参照されているすべての連絡先を取得することです。クエリの SQL バージョンは次のようになります。
SELECT * FROM dbo.Contacts c INNER JOIN dbo.WorkspaceReferencedContacts wc ON wc.ContactId = c.ContactId WHERE wc.WorkspaceId = '57F685C0-428C-44C3-8708-F30B5AF34CAE';
私は成功せずに多くの方法でアプローチしました。遅延読み込みが無効になっていることに注意してください (理由について議論する意味はありません...)。