.net 如何从EF核心导航属性转换为嵌套的Web API JSON响应?

.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,

我一直在努力学习一些基本的.Net core教程,我想创建一个使用EF core的Asp.Net core Web API

基本上,.Include()似乎什么都不做,老实说,我一开始甚至不认为这是一个必要的调用

我有一个API,其中包含了有想法的Goldfish,JSON被很好地返回给不同的对象,除了我的导航属性在Goldfish上始终为空:

[
{
    "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);