2016-11-14 77 views
-1

我已经构建了一个非常extenxive EF查询,结果是错误的。在哪里和为什么似乎无法追查,因为我的内隐感觉只是返回null。我希望有人能够指引我正确的方向。我用this open on my second monitor.EF包含查询结果有问题,内部异常为空

var databaseRequirementVersions = context.RequirementVersions 
      .Include(x => x.Requirement) 
      .Include(x => x.RequirementDetails) 
      .Include(x => x.TaggedValueRequirementCouplers) 
      .Include(x => x.TaggedValueRequirementCouplers.Select(y => y.TaggedValueVersion)) 
      .Include(x => x.TaggedValueRequirementCouplers.Select(y => y.TaggedValueVersion.TaggedValue)) 
      .Include(x => x.ConnectorRequirementCouplers) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.Connector)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.ConnectorDetails)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers.Select(a => a.TaggedValueVersion))) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers.Select(a => a.TaggedValueVersion.TaggedValue))) 
      .Where(x => x.Requirement.Guid == element.ElementGUID); 

快速破坏了数据库;
RequirementVersions总是具有1项要求(要求可以有多个版本)
RequirementVersions总是具有1个RequirementDetails
RequirementVersions具有多个TaggedValueRequirementCouplers(耦合器表)
RequirementTaggedValueVersion具有多个TaggedValueRequirementCouplers(耦合器表)
RequirementTaggedValueVersion总是具有1个RequirementTaggedValue (RequirementTaggedValue可以有多个版本)

RequirementVersions有多个ConnectorRequirementCouplers(耦合器表)
Connecto rVersion具有多个ConnectorRequirementCouplers(耦合器表)
ConnectorVersion总是具有1连接器(连接器可以具有多个版本)
ConnectorVersion总是具有1个ConnectorDetails
ConnectorVersion具有多个ConnectorTaggedValueCouplers(耦合器表)
ConnectorTaggedValueVersion具有多个ConnectorTaggedValueCouplers(联接器的表)
ConnectorTaggedValueVersion具有1个ConnectorTaggedValue(ConnectorTaggedValue可以有多个ConnectorTaggedValueVersions)

例外: enter image description here 堆栈跟踪从MoreLinq MaxBy<>开始,它位于包含语句下方,它尝试发出以下代码行;

var MyList = new List<RequirementVersion>(); 
MyList.Add(databaseRequirementVersions?.MaxBy(x => x.Version)); 

我已经做了什么来得出结论我的.Include是坏的;
当我注释掉(//)所有.Include的比第2层(所以任何打算过去y. - 这意味着y.ConnectorVersion的作品,但y.ConnectorVersion.Connector,或(假设)y.ConnectorVersion.Select(z => z.Connector)不工作)不断深入查询被接受。

正如我似乎无法通过自己与可用的工具来算出这个一出来,我希望有人能指出我在正确的方向..

编辑: @Evk要我改变MaxBy<> -statement以确保它不会导致问题本身,所以这里是新的(相同的?)异常; enter image description here

+1

什么烂摊子。完成恶梦维护和调试。 –

+0

从简单检查开始:启用数据库日志(context.Database.Log = Console.WriteLine或其他)。去掉 ”?”这里>“databaseRequirementVersions?”。用FirstOrDefault()替换MaxBy。 – Evk

+0

另请检查InnerException。这是什么意思 –

回答

0

所以我做了什么来找我的答案;
通过在我的DbContext构造函数中包含以下代码行;

var logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Folder\DatabaseLog.log"); 
this.DbContext.Database.Log = (s) => File.AppendAllText(logPath, s); 

我设法创建了一个相当广泛的登录数据库通信的地方。它显示错误发生的地点和原因。实际的错误在答案(列/表引用中的错字)方面没有太大的差别,但日志记录在找到答案时发挥了巨大的作用;

非常感谢您对@Evk的日志建议