EF Core 2.0 ThenInclude()导航无法访问

时间:2017-09-15 16:02:07

标签: c# entity-framework entity-framework-core

我正在尝试获取有子孙的实体

实体遵循代码优先约定,如下

//This is the father class
public partial Class Solicitud{
    [InverseProperty("Solicitud")]
    public virtual ICollection<Operacion> Operaciones { get; set; }  
    //Other properties
}

//This is the child class
public partial Class Operacion{
    [JsonIgnore] //This is so when serializing we don't get a circular reference
    [InverseProperty("Operaciones")]
    public virtual Solicitud Solicitud { get; set; }
    public virtual Practica Practica { get; set; }
    //Other Properties
}

//This is the grandchild class
public partial Class Practica
{
    String Nombre;
    //Other Properties
}

如果我这样做

context.Solicitudes
            .Include(w => w.Operaciones)
            .Where(x => x.Profesional == profesional).OrderBy(something);

运行正常,填充“Operaciones”集合,并将“Practica”属性保留为null。如上所示。
当我试图通过使用

来获得孙子孙女时,问题就出现了
context.Solicitudes
            .Include(w => w.Operaciones)
                .ThenInclude(o => o.Practica)
            .Where(x => x.Profesional == profesional);

在那里,它仍然填充了Operaciones,但是在每个Operacion中,属性practica保持为null,我得到以下消息

    warn: Microsoft.EntityFrameworkCore.Query[100106]
  The Include operation for navigation '[w].Operaciones.Practica' is unnecessary and was ignored because the navigation is not reachable in the final query results. See https://go.microsoft.com/fwlink/?linkid=850303 for more information.

对我来说没有任何意义,因为我可以做得很好

String something = solicitud.Operaciones.ElementAt(0).Practica.Nombre;

这是一个错误吗?有什么办法可以避免使用嵌套选择吗?这些类非常大,因为它们有很多属性,使用这种方法很难改变域模型。

感谢。

编辑:已编辑的标题。

2 个答案:

答案 0 :(得分:1)

您似乎需要启动查询from the entity you want as a result。在您的示例中,Practica在查询结果中不存在,因为它是嵌套的(结果查询与Practica之间没有直接路径)。

您可以尝试以这种方式重写查询(如果尚未存在,则在Practica内添加导航属性):

context.Practicas
    .Include(p => p.Operacion)
    .ThenInclude(o => o.Solicitud)
    .Where(p => p.Operacion.Solicitud.Profesional == profesional)
    .ToList();

答案 1 :(得分:0)

嗯,我认为这实际上是一个错误。

此数据库在SQL Server 2016中运行,并通过Integration Services包从旧的,未维护的Visual Fox Pro数据库迁移。

在编写所述包时出现问题,数据库最终出现了破坏外键限制的行(特别是关于Operaciones到Practicas的行),一旦我删除违反限制的行,我再次运行查询成功填充了它应该成为的每个成员。

我认为这是一个错误,因为在我看来,警告信息有点误导。它说我无法从Solicitud访问Practica,这是真实的,因为它可能永远不会让我任何实践,因为数据库被破坏了,但不是很准确,为什么我无法得到它们。