1

MULTIMEDIA タイプのインスタンスを送信しようとすると、

hasStream="true"

プロパティが true に設定されている場合、WCF データ サーバーはエンティティ データを受信して​​いないようです。

クライアント側では、オブジェクトのコレクションを反復処理し、それらを別の wcf データ サービスに送信しようとします。「その他の wcf データ サービス」への参照は次のとおりです。

this.centralCtx

また、新しいエンティティごとに保存されたストリームを設定し、すべてのプロパティをソース エンティティからコピーして初期化します。

foreach (LOCAL_TYPE localObject in localObjects)
{
  if (entityName == "MULTIMEDIA")
       {
           CentralService.ARTICOLI article = null;
           CentralService.MULTIMEDIA multimedia = new CentralService.MULTIMEDIA();
           LocalService.MULTIMEDIA lMultimedia = localObject as LocalService.MULTIMEDIA;
           multimedia.ID_MULTIMEDIA = lMultimedia.ID_MULTIMEDIA;
           multimedia.DATA_CREAZIONE = lMultimedia.DATA_CREAZIONE;
           multimedia.DATA_ULTIMA_MODIFICA = lMultimedia.DATA_ULTIMA_MODIFICA;
           multimedia.ARTICOLO_ID = lMultimedia.ARTICOLO_ID;

           this.centralCtx.TryGetEntity(
           new Uri(this.centralCtx.BaseUri + "ARTICOLI('" + multimedia.ARTICOLO_ID 
           + "')", UriKind.Absolute), out article);

           article.MULTIMEDIA.Add(multimedia);
           this.centralCtx.AddRelatedObject(article, "MULTIMEDIA", multimedia);
           DataServiceStreamResponse streamResponse = this.localCtx.GetReadStream(localObject);
           this.centralCtx.SetSaveStream(multimedia, streamResponse.Stream, 
                      true, "image/jpeg", "");
           //this.centralCtx.UpdateObject(article);
        }
        else {
          CENTRAL_TYPE cloned = DbHelper.FlatCloneFromType<LOCAL_TYPE, CENTRAL_TYPE>
                                     (localObject, centralCtx);
          this.centralCtx.AddObject(entityName, cloned);
        }
      }

      try
      {
         this.centralCtx.SaveChanges();
         Notify(progressAction, "Exported table " + entityName, null);
         successAction(this.Log);
      }
      catch (Exception ex)
      {
         Notify(progressAction, "Error exporting table " + entityName, ex);
         this.synchResult = SynchResultType.Error;
         exceptionAction(ex);
      }

これは変更インターセプター コードです。

[ChangeInterceptor("MULTIMEDIA")]
    public void OnChangeMultimedia(MULTIMEDIA changedObject, UpdateOperations op)
    {
        switch (op)
        {
            case UpdateOperations.Add:
                if(changedObject.ID_MULTIMEDIA == null)
                    changedObject.ID_MULTIMEDIA = Guid.NewGuid().ToString();
                changedObject.STATO_INTERNO = "TRASFERITO";
                changedObject.DATA_ULTIMA_MODIFICA = changedObject.DATA_ULTIMA_MODIFICA == null
                    ? DateTime.Now.ToLocalTime() : changedObject.DATA_ULTIMA_MODIFICA;
                this.CurrentDataSource.SaveChanges();
                break;
            default: break;
        }
    }

MULTIMEDIA 変更インターセプター内のサーバー上の changedObject のすべてのプロパティは、常に null です。なんで?

4

1 に答える 1

1

やっと答えが出ました。属性 hasStream でマークされたエンティティの送信は、2 つの要求を意味します。

  1. 1 つ目は、サーバーがデータベースにレコードを作成し、ファイル システムにファイルを保存する POST です。
  2. 2 つ目は、サーバーから渡された ID に対してクライアントが更新を実行する MERGE です。

そのため、サーバーへの最初のリクエストでは、オブジェクトのすべてのプロパティが null になります。

于 2012-11-30T08:36:15.073 に答える