Ich verwende Web API, um die Daten eines Buchs in einer SQlLite-Datenbank mit EF Core auf ASP.NET Core MVC zurückzugeben.ASP.NET und EF Core Web API gibt null für ein Objekt innerhalb eines Objekts zurück
Hier ist der DbContext Code:
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; }
}
}
und hier ist der Web-api Controller-Code:
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();
}
}
}
}
Sowohl die GET-Anforderungen scheinen gut zu funktionieren, und so auch die POST.
https://gyazo.com/e96c81479f7ccc084401d70cf13c4cbe
und wenn ich diesen Antrag senden, werde ich meine Daten, wie so erhalten: Wenn ich ein neues Buch hinzufügen möchten, werde ich eine POST-Anfrage, wie so senden
{
"bookId": 3,
"name": "A book on US Politics",
"author": {
"name": "Enra",
"authorId": 3
}
}
Wenn ich versuche, einen GET-Request auf/api zu tun/Bücher/3 zum Beispiel, es werden diese Daten zurück:
{
"bookId": 3,
"name": "A book on US Politics",
"author": null
}
ich habe sogar die Datenbank mit SQLLite Browser und die dat geprüft ein existiert. Es ergibt keinen Sinn für mich.
Oh, danke! Nur eine Frage, was wäre, wenn ich mehrere Werte hätte, wie würde ich diese auch einbeziehen? Es scheint auch, dass .Include nicht in der Klasse Buch existiert. – bin
@SarmadWahab Sie können Includes ketten, indem Sie mehrere Include-Anweisungen hinzufügen. Wenn Sie eine Menge von Werten haben, möchten Sie vielleicht darüber nachdenken, ob Lazy Loading wirklich Ihnen überhaupt einen Gefallen tut :) – Darendal
@SarmadWahab auch, wenn dies Ihre Frage beantwortet, achten Sie bitte darauf, die Schaltfläche unter dem akzeptieren Auf und Ab Pfeile neben der Antwort. – Darendal