4

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

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

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

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

我启动了 SQL Server 探查器并从一个基本查询和一个使用 Includes() 的查询中捕获了 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 为空。可悲的是。令人沮丧。痛苦地。(我没有“ly”)

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

我只是错过了一些基本的东西吗?有没有我遗漏的主要概念?我有一个老雇主的另一个项目,他们执行相同的操作并且它似乎有效。所以我确信这是可以做到的。只是不是在我身边??

任何帮助是极大的赞赏。我已经黔驴技穷了。 提前致谢!

4

1 回答 1

3

您是否尝试使用 composition/include 属性将模型上的集合属性化?这告诉 ria 服务也序列化 entitycollection,这里有几个链接可以让您走上正确的道路

WCF RIA 服务属性指南

WCF RIA 服务第 5 部分 - 元数据和共享类

RIA 服务中的组合支持


这是 Tim 博客中的示例:

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

[Include]
public EntityCollection<Album> Albums;

然后在域服务中执行以下操作:

public IQueryable<Artist> GetArtistsWithAlbums()
{
    return this.ObjectContext.Artists.Include("Albums");
}
于 2011-03-02T06:56:13.733 回答