.Net 4.6.1 应用程序使用 Entity Framework 4.6.1 使用 ToList() 抛出 Null 异常。 X.ToList 中的对象 X 不为空
.Net 4.6.1 application using Entity Framework 4.6.1 throws Null Exception using ToList(). The object X in X.ToList is not null
我们有一个应用程序在执行 ToList() 时导致空异常。我们将 Entity Framework 6 与 c# 和 .Net 4.6.1 结合使用。
变量名称已重命名为通用名称。如果我在语法上造成任何不一致,我深表歉意。它已经工作了很长时间,我刚刚
看到了这个问题。代码如下:
var mYOrdList = new List<Order>();
mYOrdList.Add(order);
var mYOrdQuery = mYOrdList.AsQueryable<Order>();
下面的链式语句包含 ToList(),它会抛出空值 exception.Please 请注意 .ToOrderDetail() 的 return 值不是空值!
var orderDetailViewModel = mYOrderQry.ToOrderDetail().ToList().First();
下面的代码片段显示了 ToOrderDetail() 的开头:
public static IQueryable<OrderDetailViewModel> ToOrderDetail(
this IQueryable<Order> orders)
{
return orders.Select(order => new OrderDetailViewModel
{
orderId = order.orderID,
...
我注意到在手表中查看“订单”对象中的数据时,该对象中的某些集合不可见并显示为“X”。相关消息是 - “EntityFrameworkDynamic Proxies 的元数据 - OurDataLayer 是
无效的。如果您正在执行小型转储,则可以通过使用堆收集新的小型转储并再次评估表达式来解决此问题。"
我没有在我的 c:\windows\minidump 文件夹中找到小型转储。这对应于我的 %systemroot% 目录。
有人可以指点一下吗?
谢谢,
肯
ToOrderDetail returns IQueryable
,当然不是#null。问题是 ToList
将尝试 执行 IQueryable
,这就是您的问题所在。空引用异常可能是您查询订单以填充 DTO 的代码正在尝试引用尚未预先加载的相关导航 属性。由于 EF 将使用跟踪的实体填充引用的方式,即使没有进行急切的加载调用,这看起来可能会不一致地发生。如果 DbContext
已经在跟踪一个订单问题中的相关实例,则调用将起作用,但如果您加载另一个订单,其中一个或多个引用尚未被跟踪且未急于加载,那么您会得到如果延迟加载不是 enabled/available,则为空引用。当 DTO 更改并且有人只是引用导航 属性 而没有检查 属性 在所有调用该方法的情况下是否被预先加载时,这些错误往往会显现出来。
从 运行 mYOrderQry.ToList()
开始,查找将由您的 DTO Select
语句引用的空导航属性。要修复它,您需要确保预先加载这些引用。
我们有一个应用程序在执行 ToList() 时导致空异常。我们将 Entity Framework 6 与 c# 和 .Net 4.6.1 结合使用。
变量名称已重命名为通用名称。如果我在语法上造成任何不一致,我深表歉意。它已经工作了很长时间,我刚刚 看到了这个问题。代码如下:
var mYOrdList = new List<Order>();
mYOrdList.Add(order);
var mYOrdQuery = mYOrdList.AsQueryable<Order>();
下面的链式语句包含 ToList(),它会抛出空值 exception.Please 请注意 .ToOrderDetail() 的 return 值不是空值!
var orderDetailViewModel = mYOrderQry.ToOrderDetail().ToList().First();
下面的代码片段显示了 ToOrderDetail() 的开头:
public static IQueryable<OrderDetailViewModel> ToOrderDetail(
this IQueryable<Order> orders)
{
return orders.Select(order => new OrderDetailViewModel
{
orderId = order.orderID,
...
我注意到在手表中查看“订单”对象中的数据时,该对象中的某些集合不可见并显示为“X”。相关消息是 - “EntityFrameworkDynamic Proxies 的元数据 - OurDataLayer 是 无效的。如果您正在执行小型转储,则可以通过使用堆收集新的小型转储并再次评估表达式来解决此问题。"
我没有在我的 c:\windows\minidump 文件夹中找到小型转储。这对应于我的 %systemroot% 目录。
有人可以指点一下吗?
谢谢, 肯
ToOrderDetail returns IQueryable
,当然不是#null。问题是 ToList
将尝试 执行 IQueryable
,这就是您的问题所在。空引用异常可能是您查询订单以填充 DTO 的代码正在尝试引用尚未预先加载的相关导航 属性。由于 EF 将使用跟踪的实体填充引用的方式,即使没有进行急切的加载调用,这看起来可能会不一致地发生。如果 DbContext
已经在跟踪一个订单问题中的相关实例,则调用将起作用,但如果您加载另一个订单,其中一个或多个引用尚未被跟踪且未急于加载,那么您会得到如果延迟加载不是 enabled/available,则为空引用。当 DTO 更改并且有人只是引用导航 属性 而没有检查 属性 在所有调用该方法的情况下是否被预先加载时,这些错误往往会显现出来。
从 运行 mYOrderQry.ToList()
开始,查找将由您的 DTO Select
语句引用的空导航属性。要修复它,您需要确保预先加载这些引用。