所以情况就是这样。我使用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
不会显示最近添加的记录。如果刷新应用程序,迫使它重新读取数据库中的链接?它拿起它。
所以我需要以下任一...
办法做到初始 负荷
CmsEvent
记录的2级扩展 ,所以我可以简单地通过它链接 属性为第二电网 (保留上下文)一个更好的方式来获得过滤 视图的“链接”,不产卵 这并不一个独立的上下文更新
通知“链接” 对象,它应该刷新方式, 最好不强迫它去 一路回服务器通过 异步调用 - 由于数据显然 一直在当地 上下文中更新。
任何提示?