我正在使用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,当我们开始时它不可用。但是,懒惰加载肯定会一直工作吗?
有人遇到过这样的事吗?或者可以提供另一种解释?
答案 0 :(得分:0)
您可能需要使用Include()方法,因为当您传递给方法RecordPassengersLastDrive时,可能正在您的集合上调用ToList()。因此,您将无法检查原始查询中未包含的关系数据。
var myCarPassengers = carPassengerRepository
.Include("Passenger")
.Include("Passenger.Status")
.Where(cp => cp.CarID == carID);
另请注意,在Where()方法中,您需要将carID与两个等号“==”进行比较。