【发布时间】: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 不会显示最近添加的记录。如果刷新应用程序,强制它从数据库中重新读取链接?它捡起来了。
所以我需要以下任何一个...
一种进行 2 级扩展的方法
CmsEvent的初始记录 加载所以我可以简单地传递它的链接 属性到第二个网格 (保留上下文)获得过滤器的更好方法 未生成的“链接”视图 一个独立的上下文 更新
一种通知“链接”的方法 它应该刷新的对象, 最好不要强迫它走 一路回到服务器通过 异步调用 - 因为数据清楚 已在本地更新 上下文。
有什么提示吗?
【问题讨论】:
标签: entity-framework silverlight-3.0 wcf-data-services