【问题标题】:Entity Framework not completing object graph of linked child objects实体框架未完成链接子对象的对象图
【发布时间】:2018-05-27 03:59:06
【问题描述】:

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

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();
}

此时数据保存在数据库中,我可以查询它,使用JOIN 语句链接到CustomerSuppressionList 表,它看起来很好 - 所有数据都符合预期。

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

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    答案是正确的 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 识别链接并填充子对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多