【问题标题】:Silverlight 4 with RIA + EntityFramework + MVVM: Childwindow DomainContext Load does not refresh带有 RIA + EntityFramework + MVVM 的 Silverlight 4:Childwindow DomainContext 加载不刷新
【发布时间】:2012-06-06 17:52:18
【问题描述】:

我有一个 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() 的负载上将 LoadBehavior 设置为 RefreshCurrent

假设我在一个组中有 5 个建筑物,我使用删除链接在父窗口上删除了 2 个,所以现在我有 3 个。调用子窗口。它仍然显示 5。

现在我对 GetBUGroupsCustomQuery() 的 DomainServices 进行了休息,我得到了正确的 3 值

但在 GetBUGroupResult_Completed 事件处理程序期间,我仍然看到 5 个建筑物。看起来我的 DomainContext 没有刷新,即使我指定了 loadbehavior 来刷新当前。 任何输入?

【问题讨论】:

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


    【解决方案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);
    

    我不确定您是否需要将 &lt;YourObjectType&gt; 替换为返回的实体类型,或者您是否可以删除该部分,但这至少应该让您接近。

    【讨论】:

    • 我需要替换我的 entityObject。问题是,似乎有两种不同的上下文。我可以创建一个新的 DomainContext 然后加载它。但是问题就变成了,当我们从孩子中删除后返回到父级时,父级的上下文不会刷新。不过谢谢。
    • 您可以将上下文从一个页面传递到另一个页面。我不使用 mvc,但我有一个项目正在工作,其中子窗口元素双向绑定到父上下文中的对象,当实体对象在子窗口上更改时,它会在父窗口上实时更改。
    • 这可能是一个糟糕的解决方法,但在某些情况下我最终不得不做的是在父页面上有一个事件链接到子窗口关闭事件。在“ChildWindowClosed”事件中,我将使用上面的代码刷新上下文,我删除的项目将从对象集合中分离出来。
    【解决方案2】:

    你也可以这样做:

    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保证检索到数据库的当前状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多