使用代码优先在 gridview 中包含第 3 级相关集合和显示 entity framework
include 3rd level related collection and display in gridview with code-first entity framework
我的 gridview 中有以下模板字段(ItemType 属性设置正确:ItemType="gEchoLu.Model.DiscussionTimeframe"
):
<asp:TemplateField HeaderText="Discussion Wall">
<ItemTemplate>
<asp:Label runat="server" ID="lbl_Discussion" Text="<%#Item.DiscussionWall.WallTitle %>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Course">
<ItemTemplate>
<asp:Label runat="server" ID="lbl_Discussion" Text="<%#Item.DiscussionWall.Course.CourseTitle %>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
第一个字段显示正确。但是,第二个模板字段始终为空。这是我将数据绑定到 gridview 的代码:
gEchoLuDBContext db = new gEchoLuDBContext();
var timeframes = db.Timeframes.Include(c => c.DiscussionWall.Course).Where(tf => tf.CreatedBy == userid).ToList();
grd_Timeframes.DataSource = timeframes;
grd_Timeframes.DataBind();
我调试的时候,Course的属性居然是null。在我的模型中,每个TimeFrame
属于一个DiscussionWall
,每个DiscussionWall
属于一个Course
。但是,a TimeFrame
和 a Course
之间没有直接关系。我不确定在这种情况下我想要的是否可行。我是否必须在 TimeFrame
和 DiscussionWall
实体之间定义(一对多)关系才能实现我想要的? (我知道这可以通过使用 OnDataBound
来完成,但我想知道是否可以使用 ItemType
来快速处理这个问题)。
以下是我模型的相关部分:
public class DiscussionWall
{
[Key]
public int WallId { get; set; }
[Required]
[StringLength(200)]
public string WallTitle { get; set; }
[Required]
[ForeignKey("Course")]
public int CourseId { get; set; }
private Course _course;
public Course Course
{
get { return _course?? (_course = new Course());}
set { _course = value; }
}
public List<DiscussionTimeframe> Timeframes { get; set; }
}
public class DiscussionTimeframe
{
public int DiscussionTimeframeId { get; set; }
[Required]
public string TimeFrameName { get; set; }
public int DiscussionWallId { get; set; }
[ForeignKey("DiscussionWallId")]
public DiscussionWall DiscussionWall { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseTitle { get; set; }
public List<DiscussionWall> DiscussionWalls { get; set; }
}
当我改变这个时它起作用了:
private Course _course;
public Course Course
{
get { return _course?? (_course = new Course());}
set { _course = value; }
}
进入这个:
public Course Course
{
get;
set;
}
我的 gridview 中有以下模板字段(ItemType 属性设置正确:ItemType="gEchoLu.Model.DiscussionTimeframe"
):
<asp:TemplateField HeaderText="Discussion Wall">
<ItemTemplate>
<asp:Label runat="server" ID="lbl_Discussion" Text="<%#Item.DiscussionWall.WallTitle %>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Course">
<ItemTemplate>
<asp:Label runat="server" ID="lbl_Discussion" Text="<%#Item.DiscussionWall.Course.CourseTitle %>"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
第一个字段显示正确。但是,第二个模板字段始终为空。这是我将数据绑定到 gridview 的代码:
gEchoLuDBContext db = new gEchoLuDBContext();
var timeframes = db.Timeframes.Include(c => c.DiscussionWall.Course).Where(tf => tf.CreatedBy == userid).ToList();
grd_Timeframes.DataSource = timeframes;
grd_Timeframes.DataBind();
我调试的时候,Course的属性居然是null。在我的模型中,每个TimeFrame
属于一个DiscussionWall
,每个DiscussionWall
属于一个Course
。但是,a TimeFrame
和 a Course
之间没有直接关系。我不确定在这种情况下我想要的是否可行。我是否必须在 TimeFrame
和 DiscussionWall
实体之间定义(一对多)关系才能实现我想要的? (我知道这可以通过使用 OnDataBound
来完成,但我想知道是否可以使用 ItemType
来快速处理这个问题)。
以下是我模型的相关部分:
public class DiscussionWall
{
[Key]
public int WallId { get; set; }
[Required]
[StringLength(200)]
public string WallTitle { get; set; }
[Required]
[ForeignKey("Course")]
public int CourseId { get; set; }
private Course _course;
public Course Course
{
get { return _course?? (_course = new Course());}
set { _course = value; }
}
public List<DiscussionTimeframe> Timeframes { get; set; }
}
public class DiscussionTimeframe
{
public int DiscussionTimeframeId { get; set; }
[Required]
public string TimeFrameName { get; set; }
public int DiscussionWallId { get; set; }
[ForeignKey("DiscussionWallId")]
public DiscussionWall DiscussionWall { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseTitle { get; set; }
public List<DiscussionWall> DiscussionWalls { get; set; }
}
当我改变这个时它起作用了:
private Course _course;
public Course Course
{
get { return _course?? (_course = new Course());}
set { _course = value; }
}
进入这个:
public Course Course
{
get;
set;
}