实体框架未完成链接子对象的对象图



我正在使用此方法为每个"客户"创建和保存后为每个"客户"创建一组子对象:

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语句链接到CustomerSuppressionList表,并且看起来不错 - 所有数据均为预期。

但是,在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识别链接并填充了孩子。

最新更新