2010-12-27 2 views
2

モバイルクライアントとLINQ to SQLを使用してデータベースに情報を格納するサーバーの2つの層を持つシステムを開発しようとしています。 タスクをサーバーに格納するWCFサーバーを作成して、クライアントからタスクを受け取り、LINQ to SQLを使用してそのタスクを格納するようにします。WCFを使用してLinq-to-Sqlオブジェクトをサーバーに送信するときのエラー

このサービスを行うために、私はdatacontextを使用できるようにdbmlファイルを作成しました。

これは私のサービスメソッドです:

public Task SaveTask(string token, Task task) 
    { 
     TrackingDataContext dataConext = new TrackingDataContext(); 


     //Saves/Updates the task 
     dataConext.Tasks.InsertOnSubmit(task); 
     dataConext.SubmitChanges(); 

     return task; 
    } 

トークンは、将来的に

を使用され、これがサービスを呼び出します私のクライアントの方法で、次のとおりです。

private void btnSave_Click(object sender, EventArgs e) 
    { 
     //Populate the object with the info 
     Task task = new Task(); 
     task.Title = tbTitle.Text; 
     task.Description = tbDescription.Text; 
     //this is a FK to another table 
     task.Severity = ((Severity)lbSeverities.SelectedItem); 
     //the first state: "open" 
     task.StateID = 1; 

     //Save the task 
     client.SaveTaskCompleted += new EventHandler<SaveTaskCompletedEventArgs>(client_SaveTaskCompleted); 
     client.SaveTaskAsync(App.Token, task); 
    } 

として、私は新しいオブジェクトを作成しています。それを埋め込み、それを私のサービスに送ります。それはそれを取得して保存します。理論的にはうまくいくはずです。

クライアントはオブジェクトを作成してサーバーに送信できます。サーバは要求を受信すると、それが再びオブジェクトを構築しようとしたが、その後私は(VS2010から自動的に作成された)この方法でSystem.Data.Linq.ForeignKeyReferenceAlreadyHasValueExceptionを取得 :

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_SeverityID", DbType="Int NOT NULL")] 
     public int SeverityID 
     { 
      get 
      { 
       return this._SeverityID; 
      } 
      set 
      { 
       if ((this._SeverityID != value)) 
       { 
        if (this._Severity.HasLoadedOrAssignedValue) 
        { 
         throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException(); 
        } 
        this.OnSeverityIDChanging(value); 
            //The exception happens in this line      
            this.SendPropertyChanging(); 
        this._SeverityID = value; 
        this.SendPropertyChanged("SeverityID"); 
        this.OnSeverityIDChanged(); 
       } 
      } 
     } 

それはすることはできません私のサーバーメソッドのエラー: 1-非常に単純で内部にロジックがありません 2私はそれをデバッグすることすらできません。私のメソッドが呼び出される前にエラーが発生しています。おそらくリクエストをアンマーシャリングします。

何が起こるか?どこから見たらいいですか?それは設定上の問題でしょうか?

は、 オスカー

編集ありがとう:彼らはそれを伝えるこのリンクSerializing Linq2Sql over Wcf - bug or misunderstanding?は、バグですが、それは1年前からある見つけました。誰かがそれが解決されたかどうか知っていますか?

答えて

3

基本的には、クライアントがマテリアライズド・オブジェクト・グラフを送信しているということです。タスクオブジェクトには、Severityプロパティと対応するSeverityIDプロパティがあります。サーバーがクライアントの要求を逆シリアル化すると、Taskオブジェクトが作成され、次にSeverityプロパティが最初に逆シリアル化されます。 SeverityIDが直列化復元されたときに今、SQLにLINQの制限は、

if (this._Severity.HasLoadedOrAssignedValue) { 
    throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException(); 
} 

あなたは、関連するオブジェクトのプロパティ(Severity)がすでに設定されている場合、外部キープロパティ(SeverityID)を設定することはできません...ヒットされています。

これは、マテリアライズドコレクションを戻すとこの種の問題が発生するため、LINQ to SQLはシリアル化モードを「単方向」と呼びます。

クライアントでSeverityプロパティを設定する代わりに、代わりにSeverityIDプロパティを設定してみてください。また、サーバー上で遅延ロードを無効にすることもできますが、これが効果を持つかどうかはわかりません。

+0

こんにちは、お返事ありがとうございます!私は既にSeverityIDを設定しようとしましたが、助けにはなりませんでした。遅延ロードを無効にして、できるだけ早くあなたに連絡していきます! – JSBach

+0

こんにちは、試しましたが、実際には役に立たなかった。 – JSBach

+1

LINQ to SQLデザイナーによって生成されたコードには、すべてのスカラープロパティのDataMemberシリアル化属性が含まれていますが、このコードは自動的に生成されます。クラスのプロパティではありません。シリアル化モードを「単方向」に設定してもよろしいですか?それ以外の場合は、Severityプロパティがデシリアライズされることはありません。 SeverityIDプロパティのみ。 – Josh

関連する問題