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

时间:2017-12-13 09:52:46

标签: c# entity-framework

我使用此方法为每个" 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语句链接到SuppressionListJOIN表,看起来很好 - 所有数据都是如预期的那样。

但是在C#代码中,ListTnc语句中填充的任何else对象都有一个完整的对象图,但if语句中填充的对象缺少其链接的SuppressionList宾语。这会导致View出错。

如果我重新加载页面,它会获取完整的对象图,一切都很好。为什么Save语句不会导致所有子对象填充其对象图?

1 个答案:

答案 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识别链接并填充子项。