【问题标题】:Include() in LINQ to Entities queryLINQ to Entities 查询中的 Include()
【发布时间】:2011-04-13 11:07:23
【问题描述】:

我的 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"),但我应该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    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 和编译时检查,这有助于避免像您遇到的错误字符串问题。

    【讨论】:

    • 第一个建议就像一个魅力,但我没有设法让第二个工作。这解决了我的问题,但第二种方式会更加优雅和健壮。谢谢。
    • @nunaxe:绝对应该可以。包含具有参数Expression&lt;Func&lt;T, TProperty&gt;&gt; path 的重载。
    • 哦,我刚刚在你的标签中看到你CTP4。你还在用CTP4版本吗?也许这个重载在这个旧版本中不存在。当前版本在这里:blogs.msdn.com/b/adonet/archive/2011/04/11/ef-4-1-released.aspx
    • 您必须包含命名空间 System.Data.Entity 以获取要编译的类型化版本。
    • @Slauma:您能否将 Jan 的评论 (System.Data.Entity) 添加到您的答案中?
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 2012-01-02
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多