silverlight - 使用RIA Services域服务的EF4中的Include()无法加载!

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

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

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

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

我可以很好地加载Event,但是我不能从Include()语句指定的子关系中获得任何东西。

加载事件时,我试图(使用紧急加载)引入所有EventParticipant及其关联的用户记录。在我的域名服务中,我具有以下内容:

    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语句中加粗了Entities的拼写,它会抛出一个错误,指出路径无效(或某种影响)……因此,我认为这些关系存在并且可以正常工作(并且我可以看到它们的定义)在设计人员代码中)。

我已删除所有筛选,尤其是在发出查询之前已放置在查询上的其他联接。这是为了确保我不会遇到更改查询形状并破坏Includes()的联接问题。对于人们来说似乎是一个大问题,我以这种方式消除了所有联接以隔离问题。它不是联接和包含的组合。

我已经重新构建了容纳域服务和RIA Services DLL的silverlight项目,几次以为我的设置有误。我已经将POCO类生成器与EF一起使用了,但是随后您读到您不能在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”)

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

我刚刚错过了一些基本的东西吗?我是否缺少一个主要概念?我有一个老雇主的另一个项目,他们在其中执行相同的操作,并且似乎起作用。因此,我相信它可以做到。只是不是我一个人??

任何帮助是极大的赞赏。我不知道该怎么做。提前致谢!

最佳答案

您是否尝试过使用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");
}

关于silverlight - 使用RIA Services域服务的EF4中的Include()无法加载!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164224/

相关文章:

javascript - LocationCollection 未标记为 ScriptableType,但可以在脚本中实例化(怎么会?)

visual-studio - VS2010RC + Silverlight 4

linq - 与技术保持同步

c# - 尝试连接到 Azure SQL 时提供程序未返回 ProviderManifestToken 字符串

silverlight - RIA 服务和故障契约(Contract)

wpf - 附加属性的各种用途是什么?

asp.net - Linq to Entities 通过位置映射表自定义排序

c# - 通过将表名、列名和值作为参数从实体进行动态 Linq SearchFor

java - 带有 Copy Artifact 插件的 Jenkins

silverlight - 引发异常的 WCF RIA 服务查询存在缓存问题