代码之家  ›  专栏  ›  技术社区  ›  Scott

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

  •  0
  • Scott  · 技术社区  · 14 年前

    好吧,我一定是工作太辛苦了,因为我无法理解正确使用实体框架需要什么。

    我想做的是:

    我有两张桌子:HeaderTable和DetailTable。detailetable的HeaderTable中的每一行都有1到多条记录。在我的EDM中,我在这两个表之间建立了一个关系来反映这一点。

    由于现在这些表之间已经建立了关系,我想通过查询HeaderTable中的所有记录,我可以访问由EDM创建的DetailTable集合(查询时可以看到属性,但它为空)。

    这是我的查询(这是一个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集合。我只是不明白这种非逻辑建模的东西是如何工作的。

    我做错什么了?任何帮助都是非常感激的。如果你需要更多的信息,请告诉我。我很乐意为您提供所需的一切。

    谢谢,

    -斯科特

    1 回复  |  直到 14 年前
        1
  •  1
  •   BeemerGuy    14 年前

    你可能缺少的是 Include() ,我认为这超出了您提供的代码的范围。

    看看这个很酷的视频;它向我解释了EDM和Linq的所有内容:
    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();
        }            
    }