【问题标题】:SL3/SL4 - Ado.Net Data Services Error during new DataServiceCollection<T>(queryResponse)SL3/SL4 - 新 DataServiceCollection<T>(queryResponse) 期间的 Ado.Net 数据服务错误
【发布时间】:2011-02-18 00:51:27
【问题描述】:

大家好,我在一个 SL 项目 (VS2010) 中有两个功能几乎完全相同,但一个会引发错误,另一个不会。这似乎与预测有关,但我不确定最佳解决方法。

起作用的功能是……

public void LoadAllChunksExpandAll(DataHelperReturnHandler handler, string orderby)
    {
        DataServiceCollection<CmsChunk> data = null;

        DataServiceQuery<CmsChunk> theQuery = _dataservice
            .CmsChunks
            .Expand("CmsItemState")
            .AddQueryOption("$orderby", orderby);

        theQuery.BeginExecute(
            delegate(IAsyncResult asyncResult)
            {
                _callback_dispatcher.BeginInvoke(
                        () =>
                        {
                            try
                            {
                                DataServiceQuery<CmsChunk> query = asyncResult.AsyncState as DataServiceQuery<CmsChunk>;
                                if (query != null)
                                {
                                    //create a tracked DataServiceCollection from the result of the asynchronous query.
                                    QueryOperationResponse<CmsChunk> queryResponse =
                                        query.EndExecute(asyncResult) as QueryOperationResponse<CmsChunk>;
                                    data = new DataServiceCollection<CmsChunk>(queryResponse);

                                    handler(data);
                                }
                            }
                            catch
                            {
                                handler(data);
                            }
                        }
                    );
            },
            theQuery
        );
    }

这会按预期编译和运行。一个非常非常相似的函数(如下所示)失败了……

             public void LoadAllPagesExpandAll(DataHelperReturnHandler handler, string orderby)
    {
        DataServiceCollection<CmsPage> data = null;

        DataServiceQuery<CmsPage> theQuery = _dataservice
            .CmsPages
            .Expand("CmsChildPages")
            .Expand("CmsParentPage")
            .Expand("CmsItemState")
            .AddQueryOption("$orderby", orderby);

        theQuery.BeginExecute(
            delegate(IAsyncResult asyncResult)
            {
                _callback_dispatcher.BeginInvoke(
                        () =>
                        {
                            try
                            {
                                DataServiceQuery<CmsPage> query = asyncResult.AsyncState as DataServiceQuery<CmsPage>;
                                if (query != null)
                                {
                                    //create a tracked DataServiceCollection from the result of the asynchronous query.
                                    QueryOperationResponse<CmsPage> queryResponse = query.EndExecute(asyncResult) as QueryOperationResponse<CmsPage>;
                                    data = new DataServiceCollection<CmsPage>(queryResponse);

                                    handler(data);
                                }
                            }
                            catch
                            {
                                handler(data);
                            }
                        }
                    );
            },
            theQuery
        );
    }

很明显,问题在于涉及自引用关系的展开投影(页面可以包含其他页面)。这是在 SL4 或 SL3 下使用 ADONETDataServices SL3 Update CTP3。

我愿意接受任何解决方法或指向 goo 信息的指针,Google 搜索错误会导致两次命中,我无法破译这两个结果都不是特别有用。

简短的错误是“无法将项目添加到集合中。当 DataServiceCollection 中的项目由 DataServiceContext 跟踪时,在项目加载到集合中之前无法添加新项目。”

完整的错误是...

System.Reflection.TargetInvocationException 被捕获 Message=Exception has 被目标抛出 调用。堆栈跟踪: 在 System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,对象[] 参数,SignatureStruct& sig, 方法属性方法属性, RuntimeType typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo 文化,布尔值 跳过可见性检查) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo文化) 在 System.Reflection.MethodBase.Invoke(对象 obj, Object[] 参数) 在 System.Data.Services.Client.ClientType.ClientProperty.SetValue(对象 实例,对象值,字符串 propertyName,布尔值允许添加) 在 System.Data.Services.Client.AtomMaterializer.ApplyItemsToCollection(AtomEntry 条目,ClientProperty 属性, IEnumerable items, Uri nextLink, ProjectionPlan continuationPlan) 在 System.Data.Services.Client.AtomMaterializer.ApplyFeedToCollection(AtomEntry 条目,ClientProperty 属性, AtomFeed 提要,布尔包含链接) 在 System.Data.Services.Client.AtomMaterializer.MaterializeResolvedEntry(AtomEntry 条目,布尔包含链接) 在 System.Data.Services.Client.AtomMaterializer.Materialize(AtomEntry 条目,类型 expectedEntryType,布尔值 包括链接) 在 System.Data.Services.Client.AtomMaterializer.DirectMaterializePlan(AtomMaterializer 物化器,AtomEntry 条目,类型 预期条目类型) 在 System.Data.Services.Client.AtomMaterializerInvoker.DirectMaterializePlan(对象 物化器,对象条目,类型 预期条目类型) 在 System.Data.Services.Client.ProjectionPlan.Run(AtomMaterializer 物化器,AtomEntry 条目,类型 预期类型) 在 System.Data.Services.Client.AtomMaterializer.Read() 在 System.Data.Services.Client.MaterializeAtom.MoveNextInternal() 在 System.Data.Services.Client.MaterializeAtom.MoveNext() 在 System.Linq.Enumerable.d__b11.MoveNext() at System.Data.Services.Client.DataServiceCollection1.InternalLoadCollection(IEnumerable1 items) at System.Data.Services.Client.DataServiceCollection1.StartTracking(DataServiceContext 上下文,IEnumerable1 items, String entitySet, Func2 entityChanged, Func2 collectionChanged) at System.Data.Services.Client.DataServiceCollection1..ctor(DataServiceContext 上下文,IEnumerable1 items, TrackingMode trackingMode, String entitySetName, Func2 entityChangedCallback, Func2 collectionChangedCallback) at System.Data.Services.Client.DataServiceCollection1..ctor(IEnumerable1 items) at Phinli.Dashboard.Silverlight.Helpers.DataHelper.<>c__DisplayClass44.<>c__DisplayClass46.<LoadAllPagesExpandAll>b__43() InnerException: System.InvalidOperationException Message=An item could not be added to the collection. When items in a DataServiceCollection are tracked by the DataServiceContext, new items cannot be added before items have been loaded into the collection. StackTrace: at System.Data.Services.Client.DataServiceCollection1.InsertItem(Int32 索引,T 项) 在 System.Collections.ObjectModel.Collection`1.Add(T 物品) 内部异常:

感谢您的帮助!

【问题讨论】:

    标签: c# silverlight silverlight-4.0 silverlight-3.0 wcf-data-services


    【解决方案1】:

    这听起来有点像数据服务中的错误。

    我将与数据服务团队联系,并给您答复。

    由于是周末,可能需要几天时间。

    Alex James

    数据服务 PM

    【讨论】:

    • 感谢你们研究它,请告诉我您的发现!
    【解决方案2】:

    我认为这里的问题是 DataServiceCollection 未能将下载的实体添加到顶级 CMSPage 类型的相应 DataServiceCollection 属性中。我们做了一些特殊的封装以确保 DataServiceCollection 只能在其开始跟踪后使用一些物体。稍后我将对此进行调查,同时尝试使用此代码:

    public void LoadAllPagesExpandAll(DataHelperReturnHandler handler, string orderby) 
    { 
      DataServiceCollection<CmsPage> data = new   DataServiceCollection<CmsPage>( _dataservice );
    
      DataServiceQuery<CmsPage> theQuery = _dataservice 
          .CmsPages 
          .Expand("CmsChildPages") 
          .Expand("CmsParentPage") 
          .Expand("CmsItemState") 
          .AddQueryOption("$orderby", orderby); 
    
      theQuery.BeginExecute( 
          delegate(IAsyncResult asyncResult) 
          { 
        _callback_dispatcher.BeginInvoke( 
          () => 
          { 
              try 
              { 
            DataServiceQuery<CmsPage> query = asyncResult.AsyncState as DataServiceQuery<CmsPage>; 
            if (query != null) 
            { 
                //create a tracked DataServiceCollection from the result of the asynchronous query. 
                QueryOperationResponse<CmsPage> queryResponse = query.EndExecute(asyncResult) as QueryOperationResponse<CmsPage>; 
                data.Load(queryResponse); 
    
                handler(data); 
            } 
              } 
              catch 
              { 
            handler(data); 
              } 
          } 
            ); 
          }, 
          theQuery 
      ); 
    } 
    

    【讨论】:

    • 感谢您的调查......遗憾的是,不,在同一点仍然是同样的例外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多