代码之家  ›  专栏  ›  技术社区  ›  Dale

使用WCF RIA服务的多个加载操作的模式

  •  2
  • Dale  · 技术社区  · 14 年前

    我希望能够在一次调用中加载多个RIA实体集,而无需将几个小的加载操作链接/嵌套在一起,以便按顺序加载。

    我有几页上面有许多组合框。这些组合框由数据库中的静态值填充(例如状态值)。

    现在,我通过一个方法在我的虚拟机中预加载这些值,该方法为我要加载的每种类型将一系列加载操作串在一起。例如:

    public void LoadEnums() {
            context.Load(context.GetMyStatusValues1Query()).Completed += (s, e) =>
            {
                this.StatusValues1 = context.StatusValues1;
                context.Load(context.GetMyStatusValues2()).Completed += (s1, e1) =>
                {
                    this.StatusValues2 = context.StatusValues2;
                    context.Load(context.GetMyStatusValues3Query()).Completed += (s2, e2) =>
                    {
                        this.StatusValues3 = context.StatusValues3;
    
                         (....and so on)
    
    
                    };
                };
            };
    };
    

    虽然这很管用,但看起来有点讨厌。另外,我想知道最后一次加载操作何时完成,以便在此之后可以加载我要处理的任何实体,以便在组合框和列表框等表单元素中正确解析这些枚举值。(我认为)如果不创建一个委托并在最后一次加载操作完成时调用它,我就无法在上面轻松地完成此操作。

    所以我的问题是:是否有人知道一个更好的模式来使用,理想情况下我可以在一个加载操作中加载所有静态EntitySet?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Dale    14 年前

    答案似乎很简单,至少在RIA Services 1.0中是这样的:

    只需一个接一个地调用LoadOperations,域上下文将使它们按照调用顺序同步。

    context.Load(context.GetMyStatusValues1Query()).Completed += (s, e) =>
      {
        this.StatusValues1 = context.StatusValues1;
      }
    
    context.Load(context.GetMyStatusValues2Query()).Completed += (s1, e1) =>
      {
        this.StatusValues1 = context.StatusValues2;
      }
    

    这对我来说似乎并不明显,因为我本以为第二个查询会在第一个查询之后立即调用,而它仍然在加载,并抛出“LoadOperation in progress”异常。

    这很好,因为这意味着在我的问题中使用丑陋的嵌套加载操作模式的唯一原因是当第二个加载操作依赖于第一个加载操作的结果时。