When I want to get a recipe from the database, the fields containing relationships to an another table are null. For exemple the ingredient
object contains a foreign key to the Recipe table: RecipeId
. So to avoid this:
[
{
"id": 1,
"name": "Burger",
"ingredients": [],
"steps": [],
"author": null
}
]
I have to make all this:
[HttpGet("{id}", Name = nameof(GetRecipeById))]
public ActionResult GetRecipeById(int id)
{
Recipe recipe = _dataStore.GetRecipeById(id);
return Ok(RetrieveRecipesInfos(recipe));
}
RecipeReadDTO RetrieveRecipesInfos(Recipe recipe) {
if (recipe == null)
return null;
RecipeReadDTO recipeRead = _map.Map<RecipeReadDTO>(recipe);
User u = _dataStore.GetUserInfos(recipe.UserLogin);
if (u == null)
return null;
recipeRead.Author = _map.Map<UserReadDTO>(u);
IEnumerable<Ingredient> ingredients = _dataStore.GetIngredientsByRecipeId(recipe.Id);
recipeRead.Ingredients = _map.Map<List<IngredientReadDTO>>(ingredients);
IEnumerable<Step> steps = _dataStore.GetStepsByRecipeId(recipe.Id);
recipeRead.Steps = _map.Map<List<StepReadDTO>>(steps);
return recipeRead;
}
public Recipe GetRecipeById(int id)
{
return _context.Recipes.FirstOrDefault<Recipe>(r => r.Id == id);
}
DbContext:
public class CookUsContext : DbContext
{
public CookUsContext(DbContextOptions<CookUsContext> options) : base(options)
{
}
public DbSet<Recipe> Recipes { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Ingredient> Ingredients { get; set; }
public DbSet<Step> Steps { get; set; }
}
}
Is there an easiest and more efficient way of doing it? Because with multiple recipes to retrieve, it can easily become slow.
you have lazy loading properly configured, but you need the Include() regardless as friends points out.
eager loading EF:
_context.Recipes.Include(rec => rec .Ingredient).FirstOrDefault(ob => ob .Id == id);