【问题标题】:ASP.NET and EF Core Web API returning null for an object within an objectASP.NET 和 EF Core Web API 为对象中的对象返回 null
【发布时间】:2017-06-24 05:30:23
【问题描述】:

我在 ASP.NET Core MVC 上使用 EF Core 使用 Web api 返回存储在 SQLLite 数据库中的 Book 的数据。

这里是 DbContext 代码:

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace Yara.SQLite
{
    public class BookingContext : DbContext
    {
        public DbSet<Book> Books { get; set; }
        public DbSet<Author> Authors { get; set; }

        //public DbSet<Author> Authors { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=books.db");
        }
    }

    public class Book
    {
        public int BookId { get; set; }
        public string Name { get; set; }

        public Author Author { get; set; }
    }

    public class Author
    {
        public string Name { get; set; }

        public int AuthorId { get; set; }
    }
}

这里是 web api 控制器代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Yara.SQLite;


namespace Yara.Controllers.API
{
    public class UsersController : Controller
    {
        [HttpGet]
        [Route("api/books")]
        public IEnumerable<Book> GetBooks()
        {
            using(var c = new BookingContext())
            {
                return c.Books.ToList();
            }
        }

        [HttpGet]
        [Route("api/books/{id:int}")]
        public Book GetBook(int id)
        {
            using(var c = new BookingContext())
            {
                return c.Books.FirstOrDefault(b => b.BookId == id);
            }
        }

        [HttpPost]
        [Route("api/books")]
        public Book AddBook([FromBody] Book book)
        {
            using(var db = new BookingContext())
            {
                db.Books.Add(book);
                db.SaveChanges();
                return db.Books.Where(o => o == book).FirstOrDefault();
            }
        }
    }
}

两个 GET 请求似乎都可以正常工作,POST 也是如此。 当我想添加一本新书时,我会发送一个 POST 请求,如下所示:

https://gyazo.com/e96c81479f7ccc084401d70cf13c4cbe

当我发送该请求时,我会得到我的数据,如下所示:

{
    "bookId": 3,
    "name": "A book on US Politics",
    "author": {
        "name": "Enra",
        "authorId": 3
    }
}

例如,当我尝试在 /api/books/3 上执行 GET 请求时,它会返回以下数据:

{
    "bookId": 3,
    "name": "A book on US Politics",
    "author": null
}

我什至使用 SQLLite 浏览器检查了数据库并且数据存在。这对我来说没有意义。

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework


    【解决方案1】:

    EF Core 使用延迟加载来提高性能。本质上,除非您明确表示要包含这些值,否则它们是 null。

    要包含您的作者信息,请将您的 get 方法更改为:

    return c.Books.Include(b=>b.Author).FirstOrDefault(b => b.BookId == id);
    

    如果需要,您还可以完全禁用延迟加载。您可以在此处找到更多信息:https://docs.microsoft.com/en-us/ef/core/querying/related-data

    【讨论】:

    • 哦,谢谢!只是一个问题,如果我有多个值,我将如何包含这些值? .Include 似乎也不存在于 Book 类中。
    • @SarmadWahab 您可以通过添加多个 .Include 语句来链接包含。如果你有很多价值观,你可能想首先考虑一下延迟加载是否真的对你有好处:)
    • @SarmadWahab,如果这回答了您的问题,请务必检查答案旁边的上下箭头下方的接受按钮。
    • 是的,我可以在 6 分钟内点击接受,但似乎 .Include 不存在。
    • 它似乎仍然不存在@Darendal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2021-01-27
    相关资源
    最近更新 更多