web-dev-qa-db-fra.com

Inclure () dans la requête LINQ to Entities

J'ai les modèles suivants dans mon projet 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; }
}

Pour référence, voici ma classe DbContext:

public class TaskManagerSets : DbContext
{
    public DbSet<Task> TaskSet { get; set; }
    public DbSet<TaskStatus> TaskStatusSet { get; set; }
}    

Ensuite, j'ai une liste action dans mon TaskController:

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

Enfin, j'ai la vue Liste des tâches:

 @model IEnumerable<TaskManager.Models.Task>

 <ul>
 @foreach (var tsk in Model) 
 { 
    <li>@tsk.Id | @tsk.CreatedOn | @tsk.Status.Description</li> 
 } 
 </ul>

Lorsque j'exécute mon projet, j'obtiens l'erreur suivante:

Un chemin d'inclusion spécifié n'est pas valide. L'EntityType 'CodeFirstNamespace.Task' ne déclare pas une propriété de navigation avec le nom 'TaskStatus'.

Le problème est certainement sur la Include("TaskStatusSet") mais comment dois-je résoudre ce problème?

25
nunaxe

Le nom de la propriété de navigation dans votre classe Task est Status. Vous devez donc utiliser:

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

Mais puisque vous travaillez avec l'API DbContext, une meilleure option consiste à utiliser la surcharge de type sécurisé d'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;

Vous obtiendrez Intellisense et des vérifications au moment de la compilation qui vous aideront à éviter les problèmes avec des chaînes incorrectes comme vous l'avez fait.

53
Slauma