gpt4 book ai didi

c# - Entity Framework 仅包括返回部分数据库数据

转载 作者:行者123 更新时间:2023-11-30 22:55:43 24 4
gpt4 key购买 nike

我是 asp.net 和 C# 的新手,请多多包涵。我正在尝试使用 Entity Framework .include() 方法从数据库返回数据,以便我可以从另一个表中获取外键信息。但是,返回的只是部分数据。似乎一切还未归还就被切断了。

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

这给了我错误:SyntaxError:JSON 输入意外结束。

请查看下面的模型类和返回的 Controller 的 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 所提到的,你在英雄和英雄类型之间有一个循环引用。序列化器将从英雄开始,然后去序列化英雄类型,它会找到英雄的集合并期望序列化,每个英雄类型都会引用一个英雄类型,以及英雄的集合。序列化器在看到这个时会退出。

我建议避免将实体类传回您的 View ,以避免 EF 和延迟加载出现问题。序列化将遍历属性,这将触发延迟加载。为避免这种情况,请为您的 View 所需的细节构造一个 View 模型,并根据需要展平。

例如,如果你想显示英雄列表及其类型:

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 帮助将实体转换为 View 模型,而无需使用 ProjectTo<TEntity> 的显式代码可以与 EF 一起使用 IQueryable实现。

  • 对于更大的现实域,您的客户可能不需要对象图中的所有内容。
  • 您不会暴露比您需要的更多的信息。 (即通过调试工具可见)
  • 不加载整个图表或不触发,您将获得性能提升延迟加载调用,并且传输的数据较少。

最后一点非常重要,因为对于复杂的对象图,SQL 可以做很多提升,从而产生比加载“所有内容”更高效的查询。对数据库的延迟访问很容易使来自客户端的每次调用增加几秒钟,加载大型图形也会对服务器产生内存影响。

关于c# - Entity Framework 仅包括返回部分数据库数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com