Opgave: EF Code First - Relations between Classes Using Include/ThenInclude

Kilder:
https://www.c-sharpcorner.com/article/navigation-property-with-code-first-navigation-property-in-ef/
Eager Loading of Related Data
Include&ThenInclude
Tracking vs. No-Tracking Queries


I denne opgave tager vi udgangspunkt i eksemplet ItemsRazor ItemRazorV11.zip





Opgaven går ud på at refaktorerer applikationen, så der ikke benyttes LINQ og DAO til at hente og vise en current users ordrer, men at der istedet anvendes navigation properties og eager loading af de relaterede objekter.
I opgaven benyttes Include og ThenInclude til at hente/loade en Orders relaterede User og Item objekter.


Step 1 (UserDbService.cs)
I stedet for metoden async Task<List<OrderDAO>> GetOrdersByUserIdAsync(int id), der benytter et LINQ udtryk med joins til at oprette og returnere en liste af OrdreDAO, skal der laves en ny metode async Task<User> GetOrdersByUserIdAsync(int id).
Metoden async Task<User> GetOrdersByUserIdAsync(int id) skal tage et UserId og returnere et User objekt, hvor alle Ordre objekter er includeret (dvs propertyen Orders i User er initialiseret med alle relaterede Order-objekter).
Hvert af Users relaterede Order-objekter skal yderligere inkludere Order's relaterede Item objekt.

public async Task<User> GetOrdersByUserIdAsync(int id)
{
User user;

using (var context = new ItemDbContext())
{
user = context.Users
.Include(u => u.Orders)
.ThenInclude(i => i.Item)
.AsNoTracking()
.FirstOrDefault(u => u.UserId == id);
}

return user;
}


Bemærk:
Include(u => u.Orders) loader users Orders (navigation property) og ThenInclude(i => i.Item) loader efterfølgende order's Item (navigation property).
AsNoTracking() benyttes da resultatet er et Read-Only objekt (objektet skal ikke efterfølgende opdateres, hvorfor der ikke er behov for at trace evt ændringer)
FirstOrDefault(u => u.UserId == id) benyttes for kun at returnere den user der har UserId == id.

Implementer metoden async Task<User> GetOrdersByUserIdAsyncr(int id) og udkommenter den gamle async Task<List<OrderDAO>> GetOrdersByUserIdAsync(int id).

 


Step 2 (UserService.cs)

UserService skal nu refaktoreres til at anvende den nye metode fra UserDbService i stedet for den gamle.
Bemærk: Returtypen skal ændres fra IEnumerable<OrderDAO> til User



Step 3 (MyOrders.cshtml.cs)

MyOrders.cshtml.cs skal nu refaktoreres til at anvende den nye/opdaterede service-metode.



Step 4 ( MyOrders.cshtml)
Refaktorer MyOrders.cshtml, så den benytter den nye liste af MyOrders af Ordre i stedet for den gamle liste af OrdreDAO objekter.

 

Step 5 (Afprøv)
Afprøv at refaktoreringen virker.

 

Step 6 (Ekstra)
Find selv på ekstra features/udvidelser til applikationen.

 


God fornøjelse!
Henrik Høltzer