.net 如何从EF核心导航属性转换为嵌套的Web API JSON响应?
我一直在努力学习一些基本的.Net core教程,我想创建一个使用EF core的Asp.Net core Web API 基本上,.Include()似乎什么都不做,老实说,我一开始甚至不认为这是一个必要的调用 我有一个API,其中包含了有想法的Goldfish,JSON被很好地返回给不同的对象,除了我的导航属性在Goldfish上始终为空:.net 如何从EF核心导航属性转换为嵌套的Web API JSON响应?,.net,json,asp.net-core,entity-framework-core,asp.net-core-webapi,.net,Json,Asp.net Core,Entity Framework Core,Asp.net Core Webapi,我一直在努力学习一些基本的.Net core教程,我想创建一个使用EF core的Asp.Net core Web API 基本上,.Include()似乎什么都不做,老实说,我一开始甚至不认为这是一个必要的调用 我有一个API,其中包含了有想法的Goldfish,JSON被很好地返回给不同的对象,除了我的导航属性在Goldfish上始终为空: [ { "id": 1, "name": "Bob", "isAlive": true, "food": 50,
[
{
"id": 1,
"name": "Bob",
"isAlive": true,
"food": 50,
"ideas": null
},..
这是金鱼类(它也不适用于ICollection)
我认为我的数据库还可以,因为我的Idea表上已经设置了外键:
ALTER TABLE [dbo].[Ideas] WITH CHECK ADD CONSTRAINT
[FK_Ideas_Goldfish_GoldfishID] FOREIGN KEY([GoldfishID])
REFERENCES [dbo].[Goldfish] ([ID])
ON DELETE CASCADE
GO
但当我访问控制器方法时:
[HttpGet]
public IEnumerable<Goldfish> GetAll()
{
var stuff = _context.Goldfish.Include(i => i.Ideas);
return stuff.ToList();
// return _context.Goldfish.ToList();
}
请让我知道我哪里出错了…我的返回类型是否排除了我想要的结构类型?我要说的是,我没有在OnModelCreating中明确设置所需的一对多,因为教程没有这样做,以下是我的全部内容:
public class GoldfishContext : DbContext
{
public GoldfishContext(DbContextOptions<GoldfishContext> options)
: base(options)
{
}
public DbSet<Goldfish> Goldfish { get; set; }
public DbSet<Idea> Ideas { get; set; }
//Interrupt the standard configuration of table names, the tutorial has this and it's nice to keep ffr
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Goldfish>().ToTable("Goldfish");
}
}
我已经指出了正确的方向(感谢Shyju),我想用明确的术语说明解决方案: .Include()的正确包是 Microsoft.EntityFrameworkCore 您需要为其添加: 使用Microsoft.EntityFrameworkCore 代码将使用错误的版本(.Net framework)运行,但include将不起任何作用 一旦您添加了正确的库,并且如果您的模型与我的模型一样链接,则您的API将超时,除非您在启动中添加以下JsonOptions以防止循环引用混乱:
services.AddMvc()
.AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
你使用的是最新版本的EF core吗?啊!看起来我添加了.Net framework包来获取Include()方法,这就是问题所在,但是它现在给了我想要的,但只发送了部分响应!i、 e.Postman说没有回应,Chrome显示了我想要的结构的开始。修复方法是添加.AddJsonOptions(x=>x.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore);我觉得这对于一件如此普通的事情来说是相当模糊的!非常感谢。我希望这个问题能对未来的我有所帮助。没有什么是“模糊的”。一个库名为JSON.NET,另一个库名为EntityFramework核心。一个对另一个一无所知。另外,启用引用也是一件好事,因为如果第一次引用已经存在,那么它会在第一次引用时自动停止,用户可能会想知道为什么它不完整。一个异常是显式的,它告诉用户问题所在,当用户禁用它时,他很清楚这种行为,因此您不应该从API返回EF核心模型,因为这一点。始终将模型转换为适合WebAPI响应的结构(即通过删除反向导航属性)
SELECT [g].[ID], [g].[Food], [g].[IsAlive], [g].[Name]
FROM [Goldfish] AS [g]
public class GoldfishContext : DbContext
{
public GoldfishContext(DbContextOptions<GoldfishContext> options)
: base(options)
{
}
public DbSet<Goldfish> Goldfish { get; set; }
public DbSet<Idea> Ideas { get; set; }
//Interrupt the standard configuration of table names, the tutorial has this and it's nice to keep ffr
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Goldfish>().ToTable("Goldfish");
}
}
var pondideas = new Idea[]
{
new Idea {Title="Bobs idea", Gist = "Give bob food", GoldfishID=1},
new Idea {Title="Bobs second idea", Gist = "Give bob more food", GoldfishID=1},
new Idea {Title="Nice idea", Gist = "Feed everyone", GoldfishID=1},
new Idea {Title="terrible idea", Gist = "Feed nobody", GoldfishID=1}
};
services.AddMvc()
.AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);