2010-01-21 58 views
1

所以情况就是这样。我使用ADP.NET数据服务1.5 CTP2使用Silverlight 3。我的EF数据模型(简称)是这样的:ADO.NET数据服务 - 在跟踪列表中传播更改?

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. 办法做到初始 负荷CmsEvent记录的2级扩展 ,所以我可以简单地通过它链接 属性为第二电网 (保留上下文)

  2. 一个更好的方式来获得过滤 视图的“链接”,不产卵 这并不一个独立的上下文更新

  3. 通知“链接” 对象,它应该刷新方式, 最好不强迫它去 一路回服务器通过 异步调用 - 由于数据显然 一直在当地 上下文中更新。

任何提示?

回答

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"); 
    } 
}