簡體   English   中英

WebApi中的實體框架序列化無法快速加載

[英]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會在子對象到達序列化程序之前對其進行加載。

顯然,如果我理解正確,這是預期的行為 我相信,在更深入地了解鏈接之后,我會感到困惑,因為我習慣於使用ObjectContext而不是DbContext

從那以后,我為解決方案轉向了另一個方向,並開始展平對象,然后使用View或匿名類型從WebApi返回,並使用自定義PUTPOST來更新和創建對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM