簡體   English   中英

實體框架只包括返回部分數據庫數據

[英]Entity Framework include only returning part of the database data

我對 asp.net 和 C# 很陌生,所以請耐心等待。 我正在嘗試使用實體框架 .include() 方法從數據庫返回數據,以便我可以從另一個表中獲取外鍵信息。 但是,返回的只是數據的一部分。 一切還來不及,仿佛就被切斷了。

"[{"id":11,"name":"Mr. Not-so-Nice","heroType":3,"heroTypeNavigation":{"id":3,"type":"Villian","heroes":["

這給了我錯誤: SyntaxError: Unexpected end of JSON input。

請查看下面的模型類和控制器的 GET 部分,在那里返回它。 如果我刪除“include()”方法,它會返回主表中的所有英雄就好了。

public partial class Hero
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? HeroType { get; set; }

    public virtual HeroTypes HeroTypeNavigation { get; set; }
}

{
public partial class HeroTypes
{
    public HeroTypes()
    {
        Heroes = new HashSet<Hero>();
    }

    public int Id { get; set; }
    public string Type { get; set; }

    public virtual ICollection<Hero> Heroes { get; set; }
}

// GET: api/Heroes
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Hero>>> GetHeroesTable()
    {
        return await _context.HeroesTable.Include(hero => hero.HeroTypeNavigation).ToListAsync();   
    }

序列化程序遞歸規則將導致此問題。 基本上就像 jonsca 提到的,你在英雄和英雄類型之間有一個循環引用。 序列化器將從英雄開始,然后去序列化英雄類型,它將找到英雄的集合並期望序列化,每個英雄類型都將引用英雄類型,以及英雄的集合。序列化器在看到這一點時退出。

我建議避免將實體類傳遞回您的視圖,以避免出現 EF 和延遲加載問題。 序列化將遍歷屬性,這將觸發延遲加載。 為避免這種情況,請為您的視圖需要的細節構建一個視圖模型,並根據需要進行展平。

例如,如果您想顯示英雄列表及其類型:

public class HeroViewModel
{
    public int HeroId { get; set; }
    public string Name { get; set; }
    public string HeroType { get; set; }
}

裝載:

var heroes = await _context.HeroesTable.Select(x => new HeroViewModel
{
    HeroId = x.HeroId,
    Name = x.Name,
    HeroType = x.HeroType.Type
}).ToListAsync();

例如,您可以利用 Automapper 來幫助將實體轉換為查看模型,而無需使用ProjectTo<TEntity>顯式代碼,它可以與 EF 的IQueryable實現一起使用。

  • 對於更大的現實域,您的客戶可能不需要對象圖中的所有內容。
  • 您不會公開比您需要的更多的信息。 (即通過調試工具可見)
  • 您將通過不加載整個圖形或觸發延遲加載調用而獲得性能提升,並且網絡上的數據更少。

最后一點是相當重要的一點,因為對於復雜的對象圖,SQL 可以做很多提升,從而產生比加載“一切”更有效的查詢。 對數據庫的惰性命中可以輕松地為來自客戶端的每次調用增加幾秒鍾,並且加載大圖對服務器也有內存影響。

暫無
暫無

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

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