2011-05-13 84 views
1

我通過WCF服務獲取我的應用程序的數據。而在服務器端,服務使用EF4.1作爲數據訪問。 服務方法看起來有點像這樣:WCF/EF 4.1的問題懶惰加載

public List<JobOffer> GetAllJobOffers() 
{ 
    var allJobOffers = _jobOffersRepository.GetAll().ToList(); 
    return allJobOffers; 
} 

,倉庫在完成這樣

public override IQueryable<JobOffer>GetAll() 
{ 
    return _context.JobOffers.Include(c => c.Company); 
} 

我得到這個奇怪的錯誤:

An error occurred while receiving the HTTP response to http://localhost:8080/JobsService/ws . This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

在調試模式後擊中F5它開始永久循環。

在我的情況下,它應該在服務器端延遲加載一些問題。因爲當我調用服務來返回具有簡單結構的對象時,它就像一個冠軍。什麼可能會搞砸了?用EF快速加載對象的最佳做法是什麼?

回答

5

當通過WCF使用EF時,應該關閉延遲加載,因爲序列化會觸發延遲加載每個導航屬性。另一個問題是默認情況下不可序列化的cyclic references。如果您的Company也具有其導航屬性Jobs它將循環引用。

+0

所以你說沒有辦法通過電線發送整個對象樹? – 2011-05-13 19:15:09

+0

有一種方法,但您必須幫助WCF序列化實體。這裏有你所有的選擇:http://stackoverflow.com/questions/5762135/ef4-cause-circular-reference-in-web-service/5763627#5763627 – 2011-05-13 19:54:18

+0

非常感謝。 EF幫助我解決了大部分問題! – 2011-05-13 20:15:35

0

我認爲你的問題更像是與循環關係有關。這一切都發生在序列化進入範圍之內時。可以說你有一個物業地址被標記爲懶惰的實體人。關係的另一方地址實體具有Person實體的導航屬性。隨着序列化的發生,它會遍歷人體實體的每個屬性,並在訪問地址導航屬性時開始加載它。現在它開始序列化Address實體,並且在它訪問Person導航屬性時,它會返回到該屬性並開始序列化它,並且在循環序列化開始並且無法完成時創建情況。爲了克服這個問題,你不必懶惰加載,但所有你必須做的是用[DataContract(IsReference = true)]來裝飾你的datacontract(在這個例子中是Person和Addresse),並且一切都像魅力一樣。