Include () nella query LINQ to Entities

Ho i seguenti modelli nel mio progetto ASP.NET MVC 3:

public class Task { public int Id { get; set; } public DateTime CreatedOn { get; set; } public TaskStatus Status { get; set; } } public class TaskStatus { public int Id { get; set; } public string Description { get; set; } } 

Per riferimento, ecco la mia class DbContext :

 public class TaskManagerSets : DbContext { public DbSet TaskSet { get; set; } public DbSet TaskStatusSet { get; set; } } 

Quindi ho una List Action nel mio TaskController :

 TaskManagerSets dbcontext = new TaskManagerSets(); public ActionResult List() { var tasks = from tsk in dbcontext.TaskSet.Include("TaskStatusSet") select tsk; return View(tasks.ToList()); } 

Finalmente ho la vista Elenco attività:

  @model IEnumerable 
    @foreach (var tsk in Model) {
  • @tsk.Id | @tsk.CreatedOn | @tsk.Status.Description
  • }

Quando eseguo il mio progetto ottengo il seguente errore:

Un percorso di inclusione specificato non è valido. EntityType ‘CodeFirstNamespace.Task’ non dichiara una proprietà di navigazione con il nome ‘TaskStatus’.

Il problema è sicuramente Include("TaskStatusSet") ma come dovrei risolvere?

Il nome della proprietà di navigazione nella class Task è Status . Quindi, dovresti usare:

 var tasks = from tsk in dbcontext.TaskSet.Include("Status") select tsk; 

Ma dal momento che stai lavorando con l’API di DbContext un’opzione migliore è utilizzare l’overload di sicurezza del tipo Include:

 using System.Data.Entity; // You must add a using statement for this namespace to have the following // lambda version of Include available //... var tasks = from tsk in dbcontext.TaskSet.Include(t => t.Status) select tsk; 

Otterrai i controlli Intellisense e in fase di compilazione, che ti aiuteranno a evitare problemi con stringhe sbagliate come hai fatto tu.