C# 填充ID时未加载ASP.NET实体框架属性
这是一个到目前为止一直有效的东西,现在它只是,停止了工作(我知道,很奇怪,可能有一些愚蠢的错误…) 我有一个C# 填充ID时未加载ASP.NET实体框架属性,c#,asp.net,entity-framework,properties,lazy-loading,C#,Asp.net,Entity Framework,Properties,Lazy Loading,这是一个到目前为止一直有效的东西,现在它只是,停止了工作(我知道,很奇怪,可能有一些愚蠢的错误…) 我有一个TripsVM,其中包含一个行程列表。我将这些加载到我的服务中,并返回一个列表 当我迭代trips集合并尝试获取trip.TripCategory.Name时,就会出现问题,因为TripCategory是空的,即使TripCategoryID有一个值 这一切都发生在后端,我加载trips,然后尝试迭代它们,它们不是从页面发送的 我可能只需要一个trip一个trip地加载trip,但它过去是
TripsVM
,其中包含一个行程列表。我将这些加载到我的服务中,并返回一个列表
当我迭代trips集合并尝试获取trip.TripCategory.Name
时,就会出现问题,因为TripCategory
是空的,即使TripCategoryID
有一个值
这一切都发生在后端,我加载trips,然后尝试迭代它们,它们不是从页面发送的
我可能只需要一个trip一个trip地加载trip,但它过去是工作的,这个bug是在使用数月后出现的
任何关于在哪里查找bug的建议都将不胜感激
谢谢
错误:
异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例
发生错误时:
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; }
}
它看起来像是在foreach代码或LazyLoadingEnabled设置为false之前释放的DB上下文 在服务中添加使用
using System.Data.Entity;
并修改加载方式
public static List<Trip> GetTrips()
{ return DB.Trips.Where(...).Include(t=>t.TripCategory).OrderBy(...).ToList(); }
publicstaticlist GetTrips()
{return DB.Trips.Where(…).Include(t=>t.TripCategory).OrderBy(…).ToList();}
我认为您的代码看起来不错,但您应该添加一些if语句以避免null异常,因为您使用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; }
}
if(tripsVM.TripsList!=null){
foreach(tripsVM.TripsList中的跳闸){
var a=trip.TripCategory.Name;
}
}
其他的
{
//处理空列表
}
私人名单(TripsList);;
公开名单
{
得到
{
_TripsList=新列表();
if(TripsService.GetTrips()!=null)
{
_添加(TripsService.GetTrips());
}
返回TripsList;
}
设置{u TripsList=value;}
}
你读过我的Q吗???ofc不是,完全不同的主题,谢谢你把我的Q标记为一个副本来破坏我的Q,先读吧,很抱歉你这么想,但是链接的答案会帮助你。如果你读过它,你就会知道它对我没有帮助。我浏览了那个链接和它关于如何避免null ref错误的大量集合,但是正如我所说的,在我的例子中,null ref错误是一些其他错误的结果,你的帖子对这种情况没有帮助。哇,只是添加using System.Data.Entity帮助了!!非常感谢,我花了大约4个小时来处理这件事。。你能给我指出一个关于这个话题的研究方向吗?我真的不明白为什么它工作了一段时间,现在我不得不添加这个使用和编译器不介意。。。谢谢我高度怀疑仅仅使用添加来修复问题。我猜您的一些代码在上下文中设置LazyLoadingEnabled=false。如果它在GET()之前执行,而不是对象引用出现,否则GETRIPSUTE()将工作良好。无论如何,我认为在代码中添加.Tebug(t= T.TrrType),如果你总是需要.TrpCytType属性信息。嗨,谢谢你的回答,但是IMO在这种情况下是可以的(我在属性里面处理它)。这里的问题是列表已填充,但旅行的导航属性为空。已解决的问题如下:)
public static List<Trip> GetTrips()
{ return DB.Trips.Where(...).Include(t=>t.TripCategory).OrderBy(...).ToList(); }
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; }
}