我使用此方法为每个" Customer"创建一组子对象。创建并保存客户后:
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;
}
这样可以正常工作,并返回预期的数据 - 只填充了SuppressionListId的ListTnc
个对象列表。在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();
}
此时数据保存在数据库中,我可以查询它,使用Customer
语句链接到SuppressionList
和JOIN
表,看起来很好 - 所有数据都是如预期的那样。
但是在C#代码中,ListTnc
语句中填充的任何else
对象都有一个完整的对象图,但if
语句中填充的对象缺少其链接的SuppressionList宾语。这会导致View出错。
如果我重新加载页面,它会获取完整的对象图,一切都很好。为什么Save语句不会导致所有子对象填充其对象图?
答案 0 :(得分:0)
答案是,似乎正确的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识别链接并填充子项。