2009-06-02 6 views
2

必要なテーブルを使用してdbmlファイルを作成しました。生成されたメソッドの1つは、そのようなものであり、名前は変更されており、構文的に正しいものではありません。しかし、私のコードは作成された元のメソッドでコンパイルされます。私はこのコードでは、以下を参照のように見えますWCF/LINQ to SQLのシリアル化

DataContractSerializer ser = 
       new DataContractSerializer(clientObj.GetType()); 
var memStream = new System.IO.MemoryStream(); 
ser.WriteObject(memStream ,clientObj); 
memStream .Seek(0, System.IO.SeekOrigin.Begin); 
var streamReader = new System.IO.StreamReader(memStream); 
var xml = streamReader.ReadToEnd(); 

を使用して、私の結果セットをシリアル化しようとすると、私はブレークポイントを設定した場合、それは常に

if ((this.serializing && (this._ToEmployees.HasLoadedOrAssignedValues == false))) 

はnullを返します

[Association(Name="Clients_ToEmployee", Storage="_ToEmployees", ThisKey="ClientID", OtherKey="ClientID")] 
[DataMember(Order=70, EmitDefaultValue=false)] 
public EntitySet<ClientToEmployee> ClientToEmployees 
{ 
    get 
    { 
     if ((this.serializing &&(this._ToEmployees.HasLoadedOrAssignedValues == false))) 
     { 
      return null; 
     } 
     return this._ToEmployees; 
    } 
    set 
    { 
     this._ToEmployees.Assign(value); 
    } 
} 

とコードをステップして上記のステートメントを実行します。

this._ToEmployees.HasLoadedOrAssignedValues 

がtrueで、nullが返されるのではなくオブジェクトを取得します。

コードを実行中に正しく動作するのはなぜですか? Entitysetオブジェクトが移入されるように遅延を導入すべきですか?

答えて

0

私たちが確信するためには、より多くのコードを含める必要がありますが、それはあなたに真実を伝える可能性を考慮してください。たぶんそこには誰もいません。たぶんあなたは何らかの理由でデバッガの外で実行しているものとは異なるコードパスを踏んでいるでしょう。あなたがコードを投稿していないので、私たちにはわかりません。

シナリオを簡略化してもう一度お試しください。

また、WebサービスからLINQ to SQLまたはLINQ to Entitiesオブジェクトを返すことをお勧めします。マイクロソフトでは残念ながら、実装依存のデータを基本クラスに含めることを選択しているため、これらはきれいにシリアル化されません。

2

私のWCFサービスで同じ問題がありました。私の場合は、デバッグ中にLinqが子レコードを遅延ロードするのに十分な時間があったという事実がありました。デバッグモードでないときは、親レコードを返すだけでした。私の方法のほとんどは問題ありませんでしたが、1つは多くの子レコードを持つ親レコードが多く、子レコードのどれもそれを作成しませんでした。だから、私はWCFメソッドでこのコードを配置:

DataLoadOptions dlOptions = new DataLoadOptions(); 
dlOptions.LoadWith<ParentTable>(Parent => Parent.Child); 
dc.LoadOptions = dlOptions; 
0
DataLoadOptions dlOptions = new DataLoadOptions(); 
dlOptions.LoadWith<ParentTable>(Parent => Parent.Child); 
dc.LoadOptions = dlOptions; 

それは動作します。

私は本当に解決策を見つけるのに多くの時間を費やしています... !!