ASP.NET Entity Framework 填充 ID 时未加载属性
ASP.NET Entity Framework property not loaded while ID filled
这是一直有效的东西,现在它只是停止了工作(我知道,很奇怪,可能有一些愚蠢的错误..)
我有一个 TripsVM
,其中包含旅行列表。我将这些加载到我的服务中,返回 List<>
.
当我遍历 trips 集合并尝试获取 trip.TripCategory.Name
时出现问题,因为 TripCategory
为空,即使 TripCategoryID
有值。
这一切都发生在后端,我加载行程然后尝试迭代它们,它们不是从页面发送的。
我可能只能通过旅行本身加载旅行,但它曾经有效,这个错误是在使用几个月后才出现的。
任何关于在哪里寻找错误的建议都将不胜感激。
谢谢
错误:
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
发生错误的地方:
foreach (Trip trip in tripsVM.TripsList) {
var a = trip.TripCategory.Name;
TripsVM:
private List<Trip> _TripsList;
public List<Trip> TripsList
{
get
{
if (_TripsList == null)
{
_TripsList = TripsService.GetTrips();
if (_TripsList == null)
_TripsList = new List<Trip>();
}
return _TripsList;
}
set { _TripsList = value; }
}
服务:
public static List<Trip> GetTrips()
{
return DB.Trips.Where(...).OrderBy(...).ToList();
}
旅行等级:
public partial class Trip
{
public int TripID { get; set; }
public int TripCategoryID { get; set; }
....
public virtual TripCategory TripCategory { get; set; }
}
您的数据库上下文似乎是在 foreach 代码或 LazyLoadingEnabled 设置为 false 之前处理的。
在服务中添加使用
using System.Data.Entity;
并修改加载方式
public static List<Trip> GetTrips()
{ return DB.Trips.Where(...).Include(t=>t.TripCategory).OrderBy(...).ToList(); }
我认为你的代码看起来不错,但你应该添加一些 if 语句来避免空异常,因为你返回的是带有 where 子句的东西,所以你最终可能会得到空查询结果和空列表,在那个列表中你正在尝试访问列表对象的元素:
if(tripsVM.TripsList != null){
foreach (Trip trip in tripsVM.TripsList) {
var a = trip.TripCategory.Name;
}
}
else
{
// handle empty list
}
private List<Trip> _TripsList;
public List<Trip> TripsList
{
get
{
_TripsList = new List<Trip>();
if(TripsService.GetTrips() != null)
{
_TripsList.add(TripsService.GetTrips());
}
return _TripsList;
}
set { _TripsList = value; }
}
这是一直有效的东西,现在它只是停止了工作(我知道,很奇怪,可能有一些愚蠢的错误..)
我有一个 TripsVM
,其中包含旅行列表。我将这些加载到我的服务中,返回 List<>
.
当我遍历 trips 集合并尝试获取 trip.TripCategory.Name
时出现问题,因为 TripCategory
为空,即使 TripCategoryID
有值。
这一切都发生在后端,我加载行程然后尝试迭代它们,它们不是从页面发送的。
我可能只能通过旅行本身加载旅行,但它曾经有效,这个错误是在使用几个月后才出现的。
任何关于在哪里寻找错误的建议都将不胜感激。
谢谢
错误:
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
发生错误的地方:
foreach (Trip trip in tripsVM.TripsList) {
var a = trip.TripCategory.Name;
TripsVM:
private List<Trip> _TripsList;
public List<Trip> TripsList
{
get
{
if (_TripsList == null)
{
_TripsList = TripsService.GetTrips();
if (_TripsList == null)
_TripsList = new List<Trip>();
}
return _TripsList;
}
set { _TripsList = value; }
}
服务:
public static List<Trip> GetTrips()
{
return DB.Trips.Where(...).OrderBy(...).ToList();
}
旅行等级:
public partial class Trip
{
public int TripID { get; set; }
public int TripCategoryID { get; set; }
....
public virtual TripCategory TripCategory { get; set; }
}
您的数据库上下文似乎是在 foreach 代码或 LazyLoadingEnabled 设置为 false 之前处理的。
在服务中添加使用
using System.Data.Entity;
并修改加载方式
public static List<Trip> GetTrips()
{ return DB.Trips.Where(...).Include(t=>t.TripCategory).OrderBy(...).ToList(); }
我认为你的代码看起来不错,但你应该添加一些 if 语句来避免空异常,因为你返回的是带有 where 子句的东西,所以你最终可能会得到空查询结果和空列表,在那个列表中你正在尝试访问列表对象的元素:
if(tripsVM.TripsList != null){
foreach (Trip trip in tripsVM.TripsList) {
var a = trip.TripCategory.Name;
}
}
else
{
// handle empty list
}
private List<Trip> _TripsList;
public List<Trip> TripsList
{
get
{
_TripsList = new List<Trip>();
if(TripsService.GetTrips() != null)
{
_TripsList.add(TripsService.GetTrips());
}
return _TripsList;
}
set { _TripsList = value; }
}