[英]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.