实体框架 - 返回关系实体的问题

时间:2010-11-16 00:24:03

标签: entity-framework linq-to-entities

好的,我必须努力工作,因为我无法理解正确使用实体框架所需的内容。

以下是我要做的事情:

我有两个表: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

1 个答案:

答案 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();
    }            
}