2011-04-13 21 views
22

He los siguientes modelos en mi ASP.NET MVC 3 proyectos:include() en LINQ a Entidades consultar

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; } 
} 

Como referencia, aquí está mi DbContext clase:

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

Entonces tengo una Lista Acción en mi TaskController:

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

fin tengo la lista de tareas Vista:

@model IEnumerable<TaskManager.Models.Task> 

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

Cuando ejecuto mi proyecto me sale el siguiente error:

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

El problema es, sin duda en el Include("TaskStatusSet") pero ¿cómo puedo solucionar este problema ?

Respuesta

47

El nombre de la propiedad de navegación en su clase Task es Status. Por lo tanto, usted tiene que utilizar:

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

Pero ya se está trabajando con la API DbContext una mejor opción es utilizar la sobrecarga de tipo seguro de incluir:

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; 

Usted recibirá Intellisense y comprobaciones en tiempo de compilación que ayudan a evitar problemas con cadenas incorrectas como las que tenía.

+0

La primera sugerencia funciona como un amuleto, pero no logré obtener el segundo trabajo. Esto resuelve mi problema, pero la segunda forma sería más elegante y robusta. Gracias. – nunaxe

+0

@nunaxe: Definitivamente debería funcionar. Include tiene una sobrecarga con un parámetro 'Expression > path'. – Slauma

+0

Oh, acabo de ver que 'CTP4' en sus etiquetas. ¿Sigues usando la versión CTP4? Tal vez esta sobrecarga no existía en esta versión anterior. La versión actual está aquí: http://blogs.msdn.com/b/adonet/archive/2011/04/11/ef-4-1-released.aspx – Slauma