2009-06-02 70 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; 

它的工作原理。

我真的花费很多时间来找到解决方案...... !!