4

我无法使用Include()方法返回多个实体(热切加载)。我正在尝试使用RIA服务加载Silverlight应用程序中的实体。数据模型包含以下关系:使用RIA服务域服务不加载包含()在EF4中!

Events.ID = EventParticipants.EventsID
EventParticipants.ParticipantUserID = Users.ID

因此,一个事件可以有很多参与者和参与者正好是1用户。

我可以加载事件就好了,但我不能得到什么出由include()语句中指定的子关系。

当我加载一个事件时,我试图拉入所有EventParticipants及其相关的用户记录(使用加载加载)。在我的域名服务,我有以下几点:

public IQueryable<Event> GetEvents() 
    { 
     return this.ObjectContext.Events     
        .Include("EventParticipants") 
        .Include("EventParticipants.User"); 

    } 

然后我拿的IQueryable时返回,并使用在客户端上,像这样我的域背景信息加载:

DomainContext.Load(DomainContext.GetEventsQuery(), LoadOperationCompleted, true); 

(通常我会过滤这可是我的一切简化到找到问题的心脏)

在我LoadOperationCompleted我有2路,我用它来查看是否返回的参赛者,但我从来没有收到任何参与者查询回来。 (在数据库中,我有242个活动定义......所有这些都参加)

private void LoadOperationCompleted(LoadOperation lo) 
    { 

     if (lo.Error != null) 
     { 
      Debugger.Break(); 
      lo.MarkErrorAsHandled(); 
     } 

     foreach (Event item in lo.Entities) 
     { 

      foreach (var particpant in item.EventParticipants) 
      { 
       Debug.WriteLine("{0} {1}", particpant.User.First, particpant.User.Last); 
      } 

     } 

    } 

我还修改了上面的代码(见下文),通过原域范围内,而不是实体的集合旋转该通过加载操作参数传递给无效。 (事件在那里,孩子们都没有)

foreach (Event item in DomainContext.Events) 

在我的数据模型中,有三个构造函数(所有生成的)参数变化。在每个我已禁用延迟加载,如下所示:

this.ContextOptions.LazyLoadingEnabled = false; 

DataModel.edmx的XML表示中有一个注释。我认为这只是为了生成目的...但我也是这样改变的:

<EntityContainer Name="MyCrazyEntities" annotation:LazyLoadingEnabled="false"> 

我已经在我的SQL Server 2008数据库中定义了关系。设计师挑选了这些,并在我的模型中创建了所有的关系和导航属性。检查他们,他们似乎有效。如果我在包含语句中强调实体的拼写,它会抛出一个错误,指出该路径无效(或其他影响)......所以我相信这些关系存在并且是功能性的(我可以看到它们的定义在设计师的代码和whatnot)。

我已经删除了所有的过滤条件,特别是在发布它之前我已经在查询中添加了额外的连接。这是为了确保我没有遇到连接更改查询形状并破坏Includes()的问题。似乎是人们面临的一个大问题,我已经以这种方式排除了所有联接来隔离问题。它不是加入和包含的组合。

我已经重建了我的Silverlight项目,这些项目包含了域服务和RIA服务DLL,有几次我认为我有一些设置错误。我已经使用EF的POCO类生成器,但随后读取您不能包含POCO相同的方式...所以我也废除了它,并返回到默认的实体生成器。

我启动了SQL Server分析器,并从基本查询中捕获了SQL,并使用了Includes()。包含的数据将返回。我通过复制探查器的查询并直接发布来验证这一点。查询的简化版本如下。的关系是有效的,我可以看到所有的相关数据是存在的(即参加者姓名,电话号码等)

SELECT 
'trimmed fields for brevity>' 
FROM (SELECT 
    'trimmed fields for brevity>' 
    CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
    FROM [dbo].[Events] AS [Extent1] 
     LEFT OUTER JOIN (SELECT 'trimmed fields for brevity>' 
     FROM [dbo].[EventParticipants] AS [Extent2] 
     INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent2].[ParticipantUsersID] = [Extent3].[ID]) AS [Join1] ON [Extent1].[ID] = [Join1].[EventsID] 
) AS [Project1] 
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC 

但是,在返回的实体时,该Event.EventParticipants EntityCollection是空的。可悲的是。令人沮丧。痛苦。 (我没有“ly”s)

我已经搜索了互联网寻找解决方案,但还没有找到任何人有相同的问题,没有通过lazyloading设置解决,结合和包含或不适当的组合导航属性。

我刚刚错过了一些基本的东西?是否有一个我缺少的重要概念?我有另一个老雇主的项目,他们在这里进行同样的操作,看起来很有效。所以我相信它可以做到。只是不是我?

任何帮助,非常感谢。我不知道该怎么做。 提前致谢!

回答

3

您是否尝试过使用composition/include属性为模型上的集合赋予属性? 这告诉RIA服务序列化entitycollection为好,继承人几个环节让你在正确的道路

A guide through WCF RIA Services attributes

WCF RIA Services Part 5 - Metadata and Shared Classes

Composition Support in RIA Services

+1

这是问题了!我在这里找到Tim Heuer的博客:[RIA Services and relational data](http://timheuer.com/blog/archive/2010/01/05/master-details-with-ria-services-and-includedresults.aspx )。我实际上只是修复了它,并且当我看到你钉了它以后又回来更新了这篇文章。 我早些时候已经阅读过关于这方面的内容,但认为(不完整),.Include(“Path”)和include属性做了同样的事情。 添加属性解决了问题。 谢谢你的回应! – Michael 2011-03-02 07:25:01

+0

不是一个问题很高兴它排序:) – 2011-03-02 09:22:26