好的,我必须努力工作,因为我无法理解正确使用实体框架所需的内容。
以下是我要做的事情:
我有两个表:HeaderTable和DetailTable。对于HeaderTable中的每一行,DetailTable将具有1到多个记录。在我的EDM中,我在这两个表之间建立了一个关系来反映这一点。
由于现在这些表之间存在关系设置,我认为通过查询HeaderTable中的所有记录,我将能够访问由EDM创建的DetailTable集合(我可以在查询时看到该属性,但它是null )。
这是我的查询(这是一个Silverlight应用程序,所以我在客户端上使用DomainContext):
// myContext is instatiated with class scope
EntityQuery<Project> query = _myContext.GetHeadersQuery();
_myContext.Load<Project>(query);
由于这些调用是异步的,我在回调完成后检查值。检查_myContext.HeaderTable的值时,我有所有预期的行。但是,_myContext.HeaderTable中的DetailsTable属性为空。
foreach (var h in _myContext.HeaderTable) // Has records
{
foreach (var d in h.DetailTable) // No records
{
string test = d.Description;
}
我假设我的查询返回所有需要修改的HeaderTable对象,以某种方式返回每个HeaderTable行的所有HeaderDetail collectoins。我只是不明白这种非逻辑建模的东西是如何运作的。
我做错了什么?任何帮助都非常有用。如果您需要更多信息,请告诉我们。我很乐意提供您需要的任何东西。
谢谢,
-Scott
答案 0 :(得分:1)
您可能缺少的是Include()
,我认为这超出了您提供的代码范围。
看看这个很酷的视频;它向我解释了有关EDM和Linq-to-Entities的所有内容:
http://msdn.microsoft.com/en-us/data/ff628210.aspx
如果您现在无法观看视频,请查看我基于这些视频的这段代码(对不起,它不在Silverlight中,但我希望它是相同的基本想法)。
检索:
public List<Story> GetAllStories()
{
return context.Stories.Include("User").Include("StoryComments").Where(s => s.HostID == CurrentHost.ID).ToList();
}
加载数据:
private void LoadAllStories()
{
lvwStories.DataSource = TEContext.GetAllStories();
lvwStories.DataBind();
}
使用数据:
protected void lvwStories_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
Story story = e.Item.DataItem as Story;
// blah blah blah....
hlStory.Text = story.Title;
hlStory.NavigateUrl = "StoryView.aspx?id=" + story.ID;
lblStoryCommentCount.Text = "(" + story.StoryComments.Count.ToString() + " comment" + (story.StoryComments.Count > 1 ? "s" : "") + ")";
lblStoryBody.Text = story.Body;
lblStoryUser.Text = story.User.Username;
lblStoryDTS.Text = story.AddedDTS.ToShortTimeString();
}
}