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; }
        }