Включить () в запрос LINQ to Entities - PullRequest
23 голосов
/ 13 апреля 2011

В моем проекте 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; }
}

Для справки, вот мой DbContext класс:

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

Тогда у меня есть Список Действие в моем TaskController :

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

Наконец, у меня есть представление списка задач:

 @model IEnumerable<TaskManager.Models.Task>

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

Когда я выполняю свой проект, я получаю следующую ошибку:

Указанный путь включения недействителен. EntityType 'CodeFirstNamespace.Task' не объявляет свойство навигации с именем 'TaskStatus'.

Проблема определенно на Include("TaskStatusSet"), но как мне это исправить?

1 Ответ

51 голосов
/ 13 апреля 2011

Имя свойства навигации в вашем классе Task равно Status. Итак, вы должны использовать:

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

Но поскольку вы работаете с DbContext API, лучшим вариантом будет использование безопасной от перегрузки типа 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;

Вы получите проверки Intellisense и времени компиляции, которые помогут избежать проблем с неправильными строками, как у вас.

...