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?
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.