2014-10-19 59 views
1

我使用EF 6和WebApi 2通過JSON.Net(也稱爲Newtonsoft)將實體序列化爲JSON。WebApi中的實體框架序列化沒有急切加載

一切正常,只要我沒有嵌套的對象。第二我做到了這一點,並試圖拉回每一個孩子的對象。

我使用預先加載(LazyLoadingEnabled = false)和我有類似這樣的查詢:

return db.Users.Include(user => user.Department).Take(10); 

然而,這些成果的序列化的循環引用結束了。儘管我沒有告訴它,但它將整個對象圖拉到一起,就好像它是懶加載的,這當然是各種各樣的不好的。

例如,嘗試序列出:

user.Department.Employees 
user.Department.Managers 
user.Department.Positions 

這當然是不好的,因爲這些都是用戶......這有部門......這讓用戶...並在明顯結束循環參考循環。

如果我使用JSON序列化的PreserveReferencesHandling.Objects我結束了它檢測的參考和添加$ref到JSON輸出和輸出的數據,但它不應該擺在首位,因爲EF不應該加載員工和經理人集合,這會破壞客戶端的事情。我試圖搞亂ProxyCreationEnabled,但這沒有什麼區別是真是假。

我嘗試使用JSON序列化程序的ReferenceLoopHandling.Ignore,它看起來像它應該檢測循環,只是停止序列化,但它進入無限循環。

編輯:這是我的API路線:

// GET: api/User 
    public IQueryable<User> GetPositions() 
    { 
     db.Configuration.ProxyCreationEnabled = false; 
     db.Configuration.LazyLoadingEnabled = false; 
     return db.Users 
      .Include(e => e.Department); 
    } 

而這裏的WebApiConfig:

 // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     var json = config.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; // returns 500 error if "None", returns unwanted data and format if "Objects" 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 

     GlobalConfiguration.Configuration.Formatters.Clear(); 
     GlobalConfiguration.Configuration.Formatters.Add(json); 

更新:我做了ToList上查詢的結果,他們最終從我的API返回前呼叫。 EF在到達序列化程序之前加載子對象。

+0

我有同樣的挫折感,而且我很少遇到需要反向參考的場景。我不知道他們爲什麼違反這些不敬虔的週期。對我而言,在設計師模式下,什麼對我而言是關閉/標記私人或內部的,反向路徑。在子/被引用的表上,有一個關係返回給父代。將它設置爲私人或內部,看看是否爲你修復它。 – Jason 2014-10-19 23:02:05

+0

當使用AutoMapper和MVC模型不使用EF對象進行序列化時,它適用於我。 – Mariusz 2014-12-17 16:29:55

回答

0

顯然,如果我正確理解這是expected behavior。我相信,在跟着更深的鏈接here後,我很困惑,因爲我習慣於使用ObjectContext而不是DbContext

我從我的解決方案的不同方向旋轉,並開始展平我的對象,然後從WebApi返回視圖或匿名類型,並使用自定義PUTPOST來更新和創建對象。

相關問題