我无法使用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设置解决,结合和包含或不适当的组合导航属性。
我刚刚错过了一些基本的东西?是否有一个我缺少的重要概念?我有另一个老雇主的项目,他们在这里进行同样的操作,看起来很有效。所以我相信它可以做到。只是不是我?
任何帮助,非常感谢。我不知道该怎么做。 提前致谢!
这是问题了!我在这里找到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
不是一个问题很高兴它排序:) – 2011-03-02 09:22:26