导航属性在实体更新后未加载

时间:2014-11-21 05:25:49

标签: c# linq entity-framework

我正在使用Entity Framework 5.

没有处理上下文。

我的代码看起来像这样...

IList<CarPassenger> myCarPassengers = carPassengerRepository.Where(cp => cp.CarID == carID);

RecordPassengersLastDrive(myCarPassengers);

// LINQ to Objects query
var backSeatPassengers = myCarPassengers.Where(cp => 
    !cp.IsDriver && 
    cp.Passenger.Status == "awake");

// Throwing NullReferenceException exception here
var passengerIDs = new List<int>(backSeatPassengers.Select(cp => cp.PassengerID);  

...

private void RecordPassengersLastDrive(IList<CarPassenger> carPassengers)
{
    foreach(CarPassenger passenger in carPassengers)
    {
        passenger.DrivingStatus = "driving";
        passenger.LastDrive = DateTIme.Now;
    }
}

我可以在分析器中看到它正在为Passenger执行查询以在LINQ查询中测试Passenger的状态,当我在SQL Management Studio中执行该查询时,查询返回Passenger数据。真是奇怪的是,如果我在RecordPassengersLastDrive之前设置一个断点并检查carPassengers,则Passenger属性不为空。如果我在更新后检查了汽车乘客,如果有两名乘客将加载,另一名则不会。

我知道代码不是理想的,它应该在LINQ to SQL查询中预加载Passenger,是的我也知道我们应该使用Entity Framework 6.0,当我们开始时它不可用。但是,懒惰加载肯定会一直工作吗?

有人遇到过这样的事吗?或者可以提供另一种解释?

1 个答案:

答案 0 :(得分:0)

您可能需要使用Include()方法,因为当您传递给方法RecordPassengersLastDrive时,可能正在您的集合上调用ToList()。因此,您将无法检查原始查询中未包含的关系数据。

var myCarPassengers = carPassengerRepository
.Include("Passenger")
.Include("Passenger.Status")
.Where(cp => cp.CarID == carID);

另请注意,在Where()方法中,您需要将carID与两个等号“==”进行比较。