我已经建立了一个相当棘手的EF查询,结果证明是错误的。在哪里以及为什么似乎无法追踪,因为我的innerexception只返回null。我希望有人能指出我正确的方向。我使用this open on my second monitor.
构建了查询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(耦合器表)
ConnectorVersion有多个ConnectorRequirementCouplers(耦合器表)
ConnectorVersion总是有1个连接器(连接器可以有多个版本)
ConnectorVersion总是有1个ConnectorDetails
ConnectorVersion有多个ConnectorTaggedValueCouplers(耦合器表)
ConnectorTaggedValueVersion有多个ConnectorTaggedValueCouplers(耦合器表)
ConnectorTaggedValueVersion有1个ConnectorTaggedValue(ConnectorTaggedValue可以有多个ConnectorTaggedValueVersions)
例外:
堆栈跟踪从MoreLinq MaxBy<>
开始,当它位于include语句的下方时,它尝试发出以下代码行;
var MyList = new List<RequirementVersion>();
MyList.Add(databaseRequirementVersions?.MaxBy(x => x.Version));
我做了什么来得出结论我的.Include
被打破了;
当我评论(//
)时,所有.Include
都比第二层更深(所以任何事情都会超过y.
- 意味着y.ConnectorVersion
有效,但是{{ 1}},或(假设)y.ConnectorVersion.Connector
不起作用)查询被接受。
由于我似乎无法用自己可用的工具来解决这个问题,所以我希望有人能指出我正确的方向..
编辑: @Evk希望我更改y.ConnectorVersion.Select(z => z.Connector)
- 语句以确保它不会导致问题本身,所以这里是新的(相同的?)异常;
答案 0 :(得分:0)
所以我做了什么来得到答案;
通过在我的DbContext构造函数中包含以下代码行;
var logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Folder\DatabaseLog.log");
this.DbContext.Database.Log = (s) => File.AppendAllText(logPath, s);
我设法创建了一个关于数据库通信发生的相当广泛的日志。它显示了错误发生的位置和原因。实际错误在答案方面没有太大差异(列/表引用中的拼写错误),但是日志记录在查找时发挥了巨大作用;
非常感谢@Evk提供的日志记录建议