The Problem
As an ASP.NET MVC4 developper, I'm using Entity Framework a lot. Considering performance I often use lazy loading for my models.
public class Result {
public int Id { get; set; }
public decimal Grade { get; set; }
public virtual Skill Skill { get; set; }
public int SkillId { get; set; }
public virtual Player Player { get; set; }
public int PlayerId { get; set; }
public virtual Category { get; set; }
public int CategoryId { get; set; }
}
If I want to include all navigation models I'll have to include all those models.
public ActionResult Details(int id = 0)
{
Result result = db.Results
.Include(r => r.Skill)
.Include(r => r.Player)
.Include(r => r.Category)
.SingleOrDefault(r => r.Id == id);
//some viewmodel mapping
return View(viewmodel);
}
My solution
I built an extension method to remove this from my controller code.
public static class IncludeExtensions
{
public static IQueryable<Result> IncludeAll(this IQueryable<Result> results)
{
return results.Include(r => r.Skill)
.Include(r => r.Player)
.Include(r => r.Category);
}
public static Result IncludedFind(this IQueryable<Result> results, int id)
{
return results.IncludeAll().SingleOrDefault(r => r.Id == id);
}
}
public ActionResult Details(int id = 0)
{
Result result = db.Results.IncludedFind(id);
//some viewmodel mapping
return View(viewmodel);
}
There are a few problems with this:
- I can't create an abstract extension class to force
IncludeAll()andIncludedFind()method. - I still have to update the extension method if my models change.
- I'll have a proliferation of extension methods/classes.
- Isn't there an
IncludeAll()like method available for Entity Framework?- Is there something like this on NuGet?
- It just feels wrong...