【问题标题】:ADO.NET Data Services - propagate changes across tracked lists?ADO.NET 数据服务 - 跨跟踪列表传播更改?
【发布时间】:2010-01-21 18:37:07
【问题描述】:

所以情况就是这样。我正在使用 ADP.NET Data Services 1.5 CTP2 和 Silverlight 3。我的 EF 数据模型(简而言之)是这样的:

CmsProfile
      Id
      Name

CmsEvent
      Id
      Title

CmsProfileEventLink
      Id
      ProfileId
      EventId

因此,人和事件之间存在许多许多关系。当我在 silverlight 中加载事件时,我会这样做:

private void AsyncLoadEventsKickoff()
{
    DataServiceQuery<CmsEvent> theQuery = dashboardService
        .CmsEvents
        .Expand("CmsProfileEventLinks")
        .AddQueryOption("$orderby", "Title");

    theQuery.BeginExecute(
        delegate(IAsyncResult asyncResult)
        {
            Dispatcher.BeginInvoke(
                () =>
                {
                    DataServiceQuery<CmsEvent> query = 
                        asyncResult.AsyncState as DataServiceQuery<CmsEvent>;
                    if (query != null)
                    {
                        //create a tracked DataServiceCollection from the 
                        //result of the asynchronous query.
                        events = DataServiceCollection
                            .CreateTracked<CmsEvent>(dashboardService,
                                query.EndExecute(asyncResult));

                        AsyncLoadTracker();
                    }
                }
            );
        },
        theQuery
    );
}

您会注意到,我无法让Expand() 真正进入下一个级别并让我获得活动链接详细信息。它只会真正告诉我是否有事件链接记录。

我将所有事件放入一个网格 (SelectionGrid),当您单击一个时,我想加载与此事件相关的人的另一个网格 (EventsGrid)。为此,我使用CmsProfileEventLink 对象加载网格,然后在DataMemberPath 上向下钻取到配置文件名称。理论上,这允许网格为我添加新链接 - 当添加一行时,我给它一个 Id,并将 CmsEvent 设置为当前事件,获取用户输入的 Profile 和 blammo -新的链接记录。

在一个完美的世界中,我可以设置peopleGrid.ItemsSource = EventsGrid.Selecteditem.CmsPeopleEventLinks,整个事情就会按预期工作。但是由于扩展没有那么深,我不能。

作为一种解决方法,我已将所有CmsProfileEventLinks 以相同的方式加载到“链接”变量中。因此,当您选择一个事件时,我会这样做(丑陋、丑陋、丑陋)以显示配置文件...

private void Sync_EventsGrid()
{
    var item = SelectionGrid.SelectedItem as CmsEvent;

    if (item.CmsEventProfileLinks != null)
    {
        DataServiceCollection<CmsEventProfileLink> x = 
            DataServiceCollection
                .CreateTracked<CmsEventProfileLink>(
                     dashboardService, 
                     links.Where(p => p.CmsEvent == item));

        EventsGrid.ItemsSource = x;
    }
}

问题是...如果在EventsGrid 中进行了更改,它不会传播回链接上下文,即使它们都共享DataService 上下文。最终结果?如果您选择不同的事件并返回,EventsGrid 不会显示最近添加的记录。如果刷新应用程序,强制它从数据库中重新读取链接?它捡起来了。

所以我需要以下任何一个...

  1. 一种进行 2 级扩展的方法 CmsEvent 的初始记录 加载所以我可以简单地传递它的链接 属性到第二个网格 (保留上下文)

  2. 获得过滤器的更好方法 未生成的“链接”视图 一个独立的上下文 更新

  3. 一种通知“链接”的方法 它应该刷新的对象, 最好不要强迫它走 一路回到服务器通过 异步调用 - 因为数据清楚 已在本地更新 上下文。

有什么提示吗?

【问题讨论】:

    标签: entity-framework silverlight-3.0 wcf-data-services


    【解决方案1】:

    您可以遍历扩展属性并在每个属性上调用 LoadProperty 以扩展其子项,如下所示:

    DataServiceQuery<CmsEvent> query 
                             = asyncResult.AsyncState as DataServiceQuery<CmsEvent>;
    if (query != null)
    {
        //create a tracked DataServiceCollection from the 
        //result of the asynchronous query.
        events = DataServiceCollection.CreateTracked<CmsEvent>(dashboardService,
                                                     query.EndExecute(asyncResult));
        AsyncLoadTracker();
    
        foreach(var link in events.SelectMany(e=> e.CmsProfileEventLink))
        {
             dashboardService.LoadProperty(link, "CmsPeopleEventLinks");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2011-06-24
      • 2021-09-28
      • 1970-01-01
      • 2010-12-24
      • 2015-02-27
      • 1970-01-01
      相关资源
      最近更新 更多