使用RIA Services Domain Service加载,在EF4中包含()!

时间:2011-03-02 06:37:46

标签: silverlight entity-framework wcf-ria-services eager-loading include-path

我无法使用Include()方法返回多个实体(急切加载)。我正在尝试使用RIA服务在silverlight应用程序中加载entites。数据模型由以下关系组成:

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

因此,一个活动可以有很多参与者,参与者只有一个用户。

我可以正常加载事件,但我无法从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数据库中定义了关系。设计师选择了这些并在我的模型中创建了所有关系和导航属性。检查他们,他们似乎有效。如果我在include语句中指责实体的拼写,它会抛出一个错误,说路径无效(或者那种效果)...所以我相信这些关系存在并且是有用的(我可以看到它们的定义在设计师代码和诸如此类的东西)。

我已经删除了所有过滤,特别是在发出查询之前我在查询上添加的其他连接。这是为了确保我没有遇到连接更改查询形状和打破Includes()的问题。对于人来说似乎是一个大问题,我已经以这种方式消除了所有联接以隔离问题。它不是连接和包含的组合。

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

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

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为空。可悲的是。令人沮丧。痛苦。 (我出于&#34; ly&#34; s)

我已经在互联网上搜索了解决方案,但是没有发现任何有同样问题的人都没有通过延迟加载设置,连接和包含或不适当的导航属性的组合来解决。

我刚刚错过了一些基本的东西吗?我缺少一个主要概念吗?我有一个来自旧雇主的另一个项目,他们执行相同的操作,似乎工作。所以我相信它可以做到。只是不是我?

非常感谢任何帮助。我没办法。 提前致谢!

1 个答案:

答案 0 :(得分: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


这是蒂姆博客的例子:

您需要手动编辑生成的metadata.cs文件(保留.txt文件中的更改列表)

[Include]
public EntityCollection<Album> Albums;

然后在域名服务中执行此操作:

public IQueryable<Artist> GetArtistsWithAlbums()
{
    return this.ObjectContext.Artists.Include("Albums");
}