我正在尝试获取有子孙的实体
实体遵循代码优先约定,如下
//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;
这是一个错误吗?有什么办法可以避免使用嵌套选择吗?这些类非常大,因为它们有很多属性,使用这种方法很难改变域模型。
感谢。
编辑:已编辑的标题。
答案 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,这是真实的,因为它可能永远不会让我任何实践,因为数据库被破坏了,但不是很准确,为什么我无法得到它们。