2009-06-02 26 views
2

我用我需要的表創建了我的dbml文件。所產生的方法之一就是這樣,名稱已被更改,並且在語法上不正確。但是我的代碼與創建的原始方法一起編譯。WCF/LINQ到SQL的序列化

[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); 
    } 
} 

當我嘗試使用

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(); 

看起來這段代碼,請參見下面連載我的結果集,它總是返回null

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

如果設置了一個破發點,並逐步通過代碼然後上述聲明

this._ToEmployees.HasLoadedOrAssignedValues 

是真的,我得到我的對象,而不是返回空。

爲什麼當我單步執行代碼時它的行爲正確?我應該引入一個延遲,以便Entityset對象被填充?

回答

0

您必須包含更多的代碼才能確定,但​​請考慮它可能會告訴您實情。也許沒有。由於某種原因,您可能正在通過不同於調試器外部執行的代碼路徑。我們無法分辨,因爲您沒有發佈代碼。

我建議您簡化場景並重試。

我還建議不要從Web服務返回LINQ to SQL或LINQ to Entities對象。微軟不幸選擇在基類中包含依賴於實現的數據,所以它們不會乾淨地序列化。

2

我在我的WCF服務中遇到了同樣的問題。在我的情況下,事實是在調試的時候,Linq有足夠的時間懶加載子記錄。不在調試模式時,它只是返回父記錄。我的大多數方法都很好,但是有很多父記錄有很多子記錄,而且沒有任何子記錄。所以我把這個代碼在我的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; 

它的工作原理。

我真的花費很多時間來找到解決方案...... !!