我使用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在到達序列化程序之前加載子對象。
我有同樣的挫折感,而且我很少遇到需要反向參考的場景。我不知道他們爲什麼違反這些不敬虔的週期。對我而言,在設計師模式下,什麼對我而言是關閉/標記私人或內部的,反向路徑。在子/被引用的表上,有一個關係返回給父代。將它設置爲私人或內部,看看是否爲你修復它。 – Jason 2014-10-19 23:02:05
當使用AutoMapper和MVC模型不使用EF對象進行序列化時,它適用於我。 – Mariusz 2014-12-17 16:29:55