我有一个silverlight 4应用程序,它使用带有EF的RIA来查询单个DomainContext中的多个表。 BUGroup,BUGroupBuilding和vwBusinessUnit。
UI基本上加载BUGroup实体集,我可以选择不同的BUGroups,它会加载子表,如下所示:
我有一个DomainContext,我将在“管理建筑物”按钮中传递给子窗口,如下所示:
ManageBuildingsChildWindow ManageBuildingscw = new ManageBuildingsChildWindow();
ManageBuildingscw.Closed += new EventHandler(ManageBuildingscw_Closed);
ManageBuildingscw.DataContext = null;
ManageBuildingsViewModel ManageBuildingsViewModel = new ManageBuildingsViewModel();
ManageBuildingscw.DataContext = ManageBuildingsViewModel;
然后我在子窗口视图模型中加载子窗口上下文,如下所示:
GetBUGroupResult = SecurityDomainContext.Current.Load(SecurityDomainContext.Current.GetBUGroupsCustomQuery(), LoadBehavior.RefreshCurrent, false);
GetBUGroupResult.Completed += new EventHandler(GetBUGroupResult_Completed);
这里是GetBUGroupResult的事件处理程序
void GetBUGroupResult_Completed(object sender, EventArgs e)
{
GetBUGroupBuildings = SecurityDomainContext.Current.BUGroupBuildings.Where(w => w.BUGroupID == BUGroupID).ToList();
GetBUGroupResult.Completed -= new EventHandler(GetBUGroupResult_Completed);
}
我将每个BUGroupBuilding绑定到数据网格中的删除链接,并从数据库中删除。当我点击管理建筑按钮来调用子窗口时,它第一次加载正常。如果我有5栋建筑物,它可以装载5栋建筑物。问题是当我在删除一些建筑物后第二次或其他时间加载它。它甚至在加载后仍保留旧的DomainContext。 我甚至尝试在GetBUGroupsCustomQuery()的Load上设置LoadBehavior为RefreshCurrent
说我在一个组中有5个建筑物,我在父窗口上使用删除链接删除了2,所以现在我有3.调用子窗口。它仍然显示5。
现在我在DomainServices上为GetBUGroupsCustomQuery()暂停了一下,我得到了正确的3值回来
但是在GetBUGroupResult_Completed事件处理程序中,我仍然看到5栋建筑物。即使我指定loadbehavior刷新当前,看起来我的DomainContext也不会刷新。 任何输入?
答案 0 :(得分:1)
我遇到了类似的问题,它通过一种解决方法解决,该方法将数据加载到上下文中,然后分离实体集合中不在新返回对象集合中的任何对象。在加载操作中尝试这样的事情:
SecurityDomainContext.Current.Load<YourObjectType>(
SecurityDomainContext.Current.GetBUGroupsCustomQuery(),
LoadBehavior.MergeIntoCurrent,
loadOperation =>
{
var results = context.Comments.Where(
entity => !loadOperation.Entities.Contains(entity)).ToList();
results.ForEach(entity => context.Comments.Detach(entity));
}, null);
我不确定您是否需要将<YourObjectType>
替换为返回的实体类型,或者您是否可以删除该部分,但这至少应该让您接近。
答案 1 :(得分:1)
你也可以这样做:
var c = SecurityDomainContext.Current;
var group = c.BUGroups.Single(w => w.BUGroupID == BUGroupID);
c.Refresh(RefreshMode.StoreWins, group.BUGroupBuildings);
GetBUGroupBuildings = group.BUGroupBuildings.ToList();
通过RefreshMode.StoreWins
,可以保证检索数据库的当前状态。