【问题标题】:ASP.NET Entity Framework property not loaded while ID filled填充 ID 时未加载 ASP.NET 实体框架属性
【发布时间】:2015-01-05 17:09:15
【问题描述】:

这是迄今为止一直有效的东西,现在它只是停止了工作(我知道,很奇怪,可能有一些愚蠢的错误..)

我有一个TripsVM,其中包含旅行列表。我将这些加载到我的服务中,返回一个List<>

当我遍历trips 集合并尝试获取trip.TripCategory.Name 时会出现问题,因为TripCategory 是空的,即使TripCategoryID 有一个值。

这一切都发生在后端,我加载行程然后尝试迭代它们,它们不是从页面发送的。

我可能只是按行程本身加载行程,但它曾经可以工作,而且这个错误是在使用几个月后才出现的。

非常感谢任何关于在哪里寻找错误的建议。

谢谢

错误:

异常详细信息: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; }
    }

服务:

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

【问题讨论】:

  • 你读过我的Q吗??? ofc 不是,完全不同的主题,感谢您将我的 Q 标记为重复,请先阅读
  • 很抱歉你有这种感觉,但链接的答案会帮助你。
  • 如果你读过它,你就会知道它对我没有帮助。我浏览了该链接及其如何避免空引用错误的精彩集合,但正如我所说,在我的情况下,空引用错误是由其他一些错误引起的,您的帖子对这种情况没有帮助。

标签: c# asp.net entity-framework properties lazy-loading


【解决方案1】:

它看起来像是在 foreach 代码或 LazyLoadingEnabled 在上下文中设置为 false 之前设置的数据库上下文。

在服务中添加使用

using System.Data.Entity;

并修改加载方式

public static List<Trip> GetTrips()
{ return DB.Trips.Where(...).Include(t=>t.TripCategory).OrderBy(...).ToList(); }

【讨论】:

  • 哇,只需添加 using System.Data.Entity 就可以了!非常感谢,我花了大约 4 个小时来处理这个问题。你能给我指出关于这个主题的一些研究方向吗?我真的不明白为什么它工作了一段时间,现在我不得不添加这个使用并且编译器不介意......谢谢!
  • 我非常怀疑只添加使用修复问题。我猜你的一些代码在上下文中设置了 LazyLoadingEnabled=false 。如果它在 GetTrips() 之前执行,则出现 Object 引用,否则 GetTrips() 工作正常。
  • 如果您总是需要 .TripCategory 属性信息,出于性能原因,我考虑在代码中添加 .Include(t=>t.TripCategory)。
【解决方案2】:

我认为您的代码看起来不错,但您应该添加一些 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; }
        }

【讨论】:

  • 嗨,感谢您的回答,但在这种情况下,IMO 没问题(我在物业内处理)。这里的问题是列表已填充,但 Trip 的导航属性为空。解决如下:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多