2014-11-21 46 views
0

我正在使用实体框架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; 
    } 
} 

我可以探查,它是为乘客测试状态进行查询看在LINQ查询中的Passenger中,当我在SQL Management Studio中执行该查询时,查询返回Passenger数据。真奇怪的是,如果我在RecordPassengersLastDrive前放置一个断点并检查carPassengers,Passenger属性不为null。如果我检查了更新后的轿厢,如果有两名乘客将会装载,另一名则不会。

我知道代码不理想,它应该在LINQ to SQL查询中预加载Passenger,并且是的,我也知道我们应该使用Entity Framework 6.0,当我们启动时它不可用。然而,当然,延迟加载应该一直工作?

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

回答

0

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

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

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

+0

carPassengerRepository.Where returns IList <>。我更新了代码以使其更清晰。 但是,包括工作。加载集合时没有使用include是一个错误。我更关心代码的稳健性,以及我们相信懒惰加载工作的类似地方,事实并非如此。 – Mick 2014-11-21 06:06:04

+0

懒惰的加载工程对IList集合的实体... http://stackoverflow.com/questions/22250246/entity-framework-lazy-loading-working-even-with-tolist – Mick 2014-11-21 06:10:02

+0

并谢谢是的。我更新了==标志。我没有从比这更复杂的代码复制代码,而不是关于汽车;)。 – Mick 2014-11-21 06:12:13