web-dev-qa-db-ja.com

LINQ to EntitiesクエリにInclude()

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

そして、私はListアクションを持っています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")にありますが、どうすれば修正できますか?

25
nunaxe

Taskクラスのナビゲーションプロパティ名はStatusです。だから、あなたは使用する必要があります:

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

ただし、DbContext AP​​Iを使用しているので、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とコンパイル時のチェックを取得します。これにより、誤った文字列の問題を回避できます。

53
Slauma