在LINQ to Entities查询中包含()

时间:2011-04-13 11:07:23

标签: c# .net asp.net-mvc-3 entity-framework-4 linq-to-entities

我的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 中有 List 动作:

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 个答案:

答案 0 :(得分:51)

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;

您将获得智能感知和编译时检查,这有助于避免出现错误字符串问题。