带有RIA + EntityFramework + MVVM的Silverlight 4:Childwindow DomainContext Load不刷新

时间:2012-06-06 17:52:19

标签: c# silverlight entity-framework silverlight-4.0 ria

我有一个silverlight 4应用程序,它使用带有EF的RIA来查询单个DomainContext中的多个表。 BUGroup,BUGroupBuilding和vwBusinessUnit。 enter image description here

UI基本上加载BUGroup实体集,我可以选择不同的BUGroups,它会加载子表,如下所示: enter image description here

我有一个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。 enter image description here

现在我在DomainServices上为GetBUGroupsCustomQuery()暂停了一下,我得到了正确的3值回来 enter image description here

但是在GetBUGroupResult_Completed事件处理程序中,我仍然看到5栋建筑物。即使我指定loadbehavior刷新当前,看起来我的DomainContext也不会刷新。 任何输入?

enter image description here

2 个答案:

答案 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,可以保证检索数据库的当前状态。