我正在使用此方法为每个"客户"创建和保存后为每个"客户"创建一组子对象:
public List<ListTnc> GetNewTncs()
{
List <ListTnc> listTncs = new List<ListTnc>();
List<SuppressionVariant> variants = SuppressionVariants.ToList();
foreach (var suppressionList in SuppressionLists.Where(sl => sl.RequireTnc))
{
if (variants.Any(d => d.ListName == suppressionList.ListName))
{
listTncs.Add(new ListTnc { SuppressionListId = variants.Where(d => d.ListName == suppressionList.ListName)
.FirstOrDefault().SuppressionListId });
}
else
{
listTncs.Add(new ListTnc { SuppressionListId = suppressionList.SuppressionListId });
}
}
return listTncs;
}
这可以正常工作,并返回预期的数据 - ListTnc
对象的列表,该对象仅在suppressionListid中填充。我在if
语句的顶部或下半部分中添加的对象之间没有区别。我这样调用:
if (model.ListTncs == null || model.ListTncs.Count == 0)
{
model.ListTncs = GetNewTncs();
}
,这似乎还不错。奇怪的是,当我保存它时:
Rep.UpdateAndSave(model);
public void UpdateAndSave<T>(T updateItem) where T : class
{
Update(updateItem);
SaveChanges();
}
在这一点上,数据保存在DB中,我可以查询它,使用JOIN
语句链接到Customer
和SuppressionList
表,并且看起来不错 - 所有数据均为预期。
但是,在C#代码中,else
语句中填充的任何ListTnc
对象都具有完整的对象图,但是if
语句中填充的对象缺少其链接的suppressionList对象。这会导致视图错误。
如果我重新加载页面,它将获取完整的对象图,一切都很好。为什么保存语句不会导致所有子对象填充其对象图?
答案是,似乎正确的ID不足以让EF拾取对象之间的链接。它必须是正确的对象的正确ID 。。
我通过这样做解决了:
public List<ListTnc> GetNewTncs()
{
List <ListTnc> listTncs = new List<ListTnc>();
List<SuppressionVariant> variants = SuppressionVariants.Include("SuppressionList).ToList();
foreach (var suppressionList in SuppressionLists.Where(sl => sl.RequireTnc))
{
if (variants.Any(d => d.ListName == suppressionList.ListName))
{
listTncs.Add(new ListTnc { SuppressionListId = variants.Where(d => d.ListName == suppressionList.ListName)
.FirstOrDefault().SuppressionList.SuppressionListId });
}
else
{
listTncs.Add(new ListTnc { SuppressionListId = suppressionList.SuppressionListId });
}
}
return listTncs;
}
因此,现在SuppressionListId
来自实际的SuppressionList
对象,而不是链接的SuppressionVariant
,EF识别链接并填充了孩子。