2014-11-21 53 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