[英]Entity Framework serialization in WebApi not eager-loading
我正在使用EF 6和WebApi 2通過JSON.Net(又名Newtonsoft)將實體序列化為JSON。
只要我沒有嵌套對象,一切都可以正常工作。 我做的第二件事很麻煩,嘗試拉回每個單個子對象。
我正在使用急切加載( 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不應該加載Employees和經理集合,這會破壞客戶端的功能。 我嘗試弄亂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);
更新:在查詢結果最終從我的api調用返回之前,我對查詢結果執行了ToList
。 EF會在子對象到達序列化程序之前對其進行加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.