2011-04-13 83 views
22

我在ASP.NET MVC 3项目以下型号:包括()在LINQ to Entities查询

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> 

当我执行我的项目,我得到以下错误:

A specified Include path is not valid. The EntityType 'CodeFirstNamespace.Task' does not declare a navigation property with the name 'TaskStatus'.

的问题肯定是在Include("TaskStatusSet"),但我应该怎么解决这个问题?

回答

47

Task类中的导航属性名称为Status。所以,你将不得不使用:

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

但因为你与DbContext API工作更好的选择是使用类型安全的超载包括:

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; 

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

+0

第一个建议就像一个魅力,但我没有设法得到第二个工作。这解决了我的问题,但第二种方法将更加优雅和强大。谢谢。 – nunaxe 2011-04-13 16:57:13

+0

@ nunaxe:肯定应该工作。包含一个带有参数'Expression > path'的重载。 – Slauma 2011-04-13 17:07:36

+0

哦,我只是看到你在你的标签中有'CTP4'。你还在使用CTP4版本吗?这个旧版本中可能没有这种超载。当前版本在这里:http://blogs.msdn.com/b/adonet/archive/2011/04/11/ef-4-1-released.aspx – Slauma 2011-04-13 17:09:48