2017-06-23 6 views
0

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.

Antwort

0

EF Core verwendet Lazy Loading, um die Leistung zu verbessern. Wenn Sie die Werte nicht ausdrücklich angeben, sind sie null.

Um die Autoreninformationen enthalten können, um Ihre Methode, um dies ändern:

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

Sie können auch Lazy Loading in seiner Gesamtheit deaktivieren, wenn Sie möchten. Weitere Informationen hierzu finden Sie hier: https://docs.microsoft.com/en-us/ef/core/querying/related-data

+0

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

+0

@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

+0

@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

Verwandte Themen