2009-06-02 5 views
2

J'ai créé mon fichier dbml avec les tables dont j'ai besoin. Une des méthodes générées est en tant que telle, les noms ont été changés et ce n'est pas syntaxiquement correct. Mais mon code compile avec la méthode originale créée.Sérialisation dans 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); 
    } 
} 

Quand j'essaie de sérialisation mon ResultSet en utilisant

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

Il ressemble à ce code, voir ci-dessous, il retourne toujours null

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

Si je mets un point de rupture et étape à travers le code, puis la déclaration ci-dessus

this._ToEmployees.HasLoadedOrAssignedValues 

est vrai et j'obtiens mon objet plutôt qu'une nulle étant retournée. Pourquoi est-ce qu'il se comporte correctement lorsque je passe le code?

Dois-je introduire un délai pour que l'objet Entityset soit rempli?

Répondre

0

Vous devrez inclure plus de code pour que nous soyons certains, mais considérez la possibilité qu'il vous dise la vérité. Peut-être qu'il n'y en a pas. Peut-être que vous passez par un chemin de code différent de celui qui s'exécute en dehors du débogueur pour une raison quelconque. Nous ne pouvons pas le dire parce que vous n'avez pas publié le code.

Je vous recommande de simplifier le scénario et d'essayer à nouveau.

Je recommande également de ne pas renvoyer les objets LINQ to SQL ou LINQ to Entities d'un service Web. Microsoft a malheureusement choisi d'inclure des données dépendantes de l'implémentation dans les classes de base, de sorte qu'ils ne se sérialisent pas proprement.

2

J'ai eu le même problème dans mon service WCF. Dans mon cas, c'était le fait que pendant le débogage, Linq avait assez de temps pour charger paresseusement les enregistrements enfants. Lorsqu'il n'était pas en mode débogage, il retournait simplement les enregistrements parents. La plupart de mes méthodes allaient bien, mais on avait beaucoup de parents avec beaucoup de dossiers d'enfants et aucun des dossiers d'enfants l'ont fait. Donc, je mets ce code dans ma méthode 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; 

Il fonctionne. Je passe vraiment beaucoup de temps à trouver la solution ... !!