1

我有以下PersonelInCourse实体:不能在EF 5检索导航属性的数据,MVC 4

public partial class PersonnelInCourse 
{ 
    public int ID { get; set; } 
    public string PersonnelID { get; set; } 
    public string CourseID { get; set; } 
    public int HoursInCourse { get; set; } 
    public byte IsApproved { get; set; } 
    public byte IsPassed { get; set; } 
    public Nullable<int> RewardDetailID { get; set; } 
    public string RejectReason { get; set; } 
    public string FailReason { get; set; } 

    public virtual Course Course { get; set; } 
    public virtual RewardDetail RewardDetail { get; set; } 
    public virtual Personnel Personnel { get; set; } 
} 

我插入这样的数据,它有没有问题:

... 
PersonnelInCourse p = new PersonnelInCourse(); 
p.CourseID = id; 
p.PersonnelID = User.Identity.Name; 
p.HoursInCourse = 0; 
p.IsApproved = 0; 
p.IsPassed = 0;    
db.PersonnelInCourses.Add(p); 
try 
{ 
    db.SaveChanges(); 
} 
... 

我尝试检索这个信息像下面的地方。然而,这会导致一个例外,我发现所有的导航属性为null,所以异常抛出:

@{  
var psic = new Models.PtDbContext().PersonnelInCourses.Where(p => p.CourseID == Model.ID); 
var c = new Models.PtDbContext().Courses.Find(Model.ID); 
int i = 1; 
} // these all are ok. 
... 

@foreach (var p in psic) 
{ 
    <tr style="border-bottom: 1px dotted black;"> 
     <td>@i.ToString()</td> 
     <td>@string.Concat(p.Personnel.FirstName, " ", p.Personnel.LastName)</td> 
    //the exception throws from here, because the navigation property Personnel is null, and all other navPrs also are null. 
     <td>@p.Personnel.Post.PostName</td> 
     <td>@p.PersonnelID</td> 
    </tr> 

    i++; 
} 

我如何能实现我想要什么?我的错误在哪里?

+1

将'.Load()'添加到您的查询中,以显式加载导航属性。 – Liel

+0

其中模型定义在顶部像'@model namespance.Models.Navigation' – Sender

+0

我已禁用延迟加载,我也在其他地方使用这种方法,我在那里没有问题。 – AminSaghi

回答

1

找到了! (基于@Liel的评论):

var psic = new jqPersonnelTraining.Models.PtDbContext().PersonnelInCourses 
    .Include("Personnel").Include("Personnel.Post").Where(p => p.CourseID == Model.ID); 

亲爱Liel,必须.Where()前添加.Include() ......非常感谢您的提示。

+0

谢谢,我根据您的输入编辑了我的答案。 – Liel

+1

这解决了这样一个大问题,我离开了隐身模式登录和投票! – OverMars

2

您应该添加Include()以明确加载导航属性。

var psic = new Models.PtDbContext().PersonnelInCourses..Include("Personnel").Where(p => p.CourseID == Model.ID);

这将加载PersonnelInCourses及其Personnel在一个查询。

如果您需要加载更多属性,只需链接更多.Include("")子句。

+0

好的。我还需要人员内另一个导航的信息(如你所见)。我是否也需要包含navpr?如果是这样,怎么样? – AminSaghi

+1

只需添加另一个'.Include(“...”)'到相同的查询 – Liel

+0

我认为你应该写。包括之前.Where – AminSaghi

1

尽量保持PtDbContext活着,直到你完成从它处理数据,并明确测试的导航属性:

@using (var context = new Models.PtDbContext()){  
    var psic = context.PersonnelInCourses.Where(p => p.CourseID == Model.ID); 
    var c = context.Courses.Find(Model.ID); 
    int i = 1; 
<table> 
    @foreach (var p in psic) 
    { 
    <tr style="border-bottom: 1px dotted black;"> 
     <td>@i.ToString()</td> 
     @if (p.Personnel == null) 
     { 
     <td><b>not found</b></td> 
     <td><b>not found</b></td> 
     } 
     else 
     { 
     <td>@string.Concat(p.Personnel.FirstName, " ", p.Personnel.LastName)</td> 
     <td>@p.Personnel.Post.PostName</td> 
     } 
     <td>@p.PersonnelID</td> 
    </tr> 
</table> 
     @i++; 
    } 
} 
+0

DbContext处于活动状态。实际上,这个表格是报告的预览。人员不能为空!因为相关的foriegn键不为空。我必须找到一种方法来检索这些导航属性 – AminSaghi