Relazioni di entità per EF7 MVC6

asp.net-core entity-framework-core

Domanda

Il mio obiettivo qui è utilizzare EF7 con MVC6 [BETA2] per elencare un numero di scaffali e il numero di libri su ogni scaffale.

Lo schema del database viene creato correttamente con le relazioni della tabella corrette. Posso aggiungere con successo mensole e libri al database, comprese le relazioni con le chiavi esterne (vedi codice sotto).

Quando provo la pagina indice che dovrebbe mostrare il numero di libri su ogni scaffale, non ricevo dati di conteggio libri e nessun errore. Nell'entità Shelf la proprietà Books rimane non popolata con le entità Book , quindi il conteggio è nullo (vedere il codice seguente).

In EF7 c'è un posto dove devo scrivere codice per popolare Shelf.Books o dovrebbe accadere automaticamente in EF7?

BookShelf.cs

namespace MyApp.Models
{
    public class Shelf
    {
        public int ShelfId { get; set; }
        public string Name { get; set; }
        public virtual List<Books> Books { get; set; }
    }

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

ApplicationDbContext.cs

namespace MyApp
{
    public class ApplicationDBContext
    {
        public DbSet<Shelf> Shelf { get; set; }
        public DbSet<Book> Book { get; set; }
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Shelf>().Key(s => s.ShelfId);
        builder.Entity<Book>().Key(b => b.BookId);

        builder.Entity<Shelf>()                
            .OneToMany(s => s.Book)
            .ForeignKey(k => k.ShelfId);

        base.OnModelCreating(builder);
    }
}

ShelfController.cs

namespace MyApp
{
    private ApplicationDBContext db;

    public BuildingsController(ApplicationDBContext context)
    {
        db = context;
    }

    // GET: Shelves
    public async Task<IActionResult> Index()
    {
        return View(await db.Shelves.ToListAsync());
    }
}

Index.cshtml

...
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Books.Count)
        </td>
    </tr>
}
....

Risposta popolare

Quello che ho scoperto è che EF non popola l'oggetto genitore con gli oggetti figli correlati fuori dalla scatola. Esempio, myShelf.Books sarà vuoto finché non verrà popolato nella funzione di azione del controller.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché