我有一个承包商和安全委员会之间的多对多关系。它们由一个桥接表ContractorsSafetyCouncils连接,该表由ContractorId和SafetyCouncilId组成。这两列形成一个复合键。在EF4中,这种关系被正确地映射。承包商实体具有属性:
public virtual ICollection<SafetyCouncil> SafetyCouncils
{
get;
set;
}
安全委员会实体具有以下属性:
public virtual ICollection<Contractor> Contractors
{
get;
set;
}
当从单个承包商或安全委员会实体中通过延迟加载访问这些属性时,它们的工作方式与预期完全相同。但是,在查询中访问此关系时:
from c in ContractorRepository.All()
where c.PQFs.Count() > 0
let psmAudits = c.PQFs.SelectMany(pqf => pqf.Audits)
let psmAudit = psmAudits.FirstOrDefault(audit => audit.CompletedDate == psmAudits.Max(a => a.CompletedDate))
let scsAudits = c.PQFs.SelectMany(pqf => pqf.SCSAudits)
let scsAudit = scsAudits.FirstOrDefault(audit => audit.CompletedDate == scsAudits.Max(a => a.CompletedDate))
select new MasterListItem()
{
AdministratorNotes = c.AdminFlags.Where(f => f.IsActive && f.ForPQF).Select(f => f.Text),
CanViewInfo = false,
ContractorName = c.ContractorName,
ContractorId = c.Id,
ContractorTaxId = c.TaxId,
SafetyCouncilIds = c.SafetyCouncils.Select(sc => sc.Id),
PQFSubmitted = c.PQFs.Max(p => p.PQFInfo.SubmittedDate.Value),
PSMAuditId = psmAudit.Id,
PSMAuditComplete = psmAudit.CompletedDate,
PSMAuditStatus = psmAudit.Status.Description,
SCSAuditId = scsAudit.Id,
SCSAuditComplete = scsAudit.CompletedDate
};
问题出现在:
。
SafetyCouncilIds = c.SafetyCouncils.Select(sc => sc.Id),
对于每个记录,SafetyCouncilIds集合都没有成员,而根据数据库中的数据,每个记录应该至少有一个与之关联的SafetyCouncilId。
如果我运行相同的查询,但是将其投影到匿名类型而不是MasterListItem类型中,则可以正常工作。为什么不能将此查询投影到我的自定义类型中?
更新:我的MasterListItem POCO包含以下属性:
public string SafetyCouncilIdsString
{
get;
set;
}
public IEnumerable<int> SafetyCouncilIds
{
set
{
StringBuilder sb = new StringBuilder(",");
foreach (var id in value)
{
sb.Append(id);
sb.Append(",");
}
this.SafetyCouncilIdsString = sb.ToString();
}
}
问题的原因是 SafetyCouncilIds 属性。我将其更改为自动属性,然后在其他地方构建字符串并投影到 POCO 上,效果非常好。