9
votes

Problème de désérialisation dans l'entité Framework 4.0

Je travaille sur une conviction, en utilisant l'entité Framework 4.0. et wcf.

Je retourne la liste des objets disent (employés) p>

et la propriété de navigation de cet objet est indiquée (départements) p>

et le département dispose d'une propriété de navigation ( Branche) P>

Je comprends tout comme P>

Employees.include("Departments.Branch");


8 commentaires

Utilisez-vous des entités de suivi automatique?


Non, ce sont des entités poco normales


Si vous le profilez sur le côté serveur, quelle serait la sortie? Est-ce que cela a des valeurs correctes?


Oui, sur le côté serveur, cela montre exactement ce que j'attends


Comment retournez-vous ces entités? Et si vous essayez d'y accéder juste avant de désérialiser, trouvez-vous de travailler bien ou quoi?


Et gentiment, postez un code afin que nous puissions mieux vous aider à mieux vous aider. Dites-nous également quelle version de EF utilisez-vous?


Pouvez-vous publier le code des classes de département et de branches?


J'ai ajouté la capture d'écran pour les entités, veuillez le regarder


6 Réponses :


0
votes

Vous pouvez essayer d'utiliser le profileur d'entité Framework et de voir si la requête générée est de disposer de données valides. http://efprof.com/


2 commentaires

Cela ne se produit que sur la désérialisation, alors rien de profileur ne pouvait faire pour moi.


D'accord. Ensuite, essayez de définir un élément de données avec des noms et d'en commandes avec des attributs, car vous avez une question de désérialisation.



0
votes

de MSDN

Windows Communication Foundation (WCF) ne peut pas directement sérialiser ou désérialiser des proxy, car le DataContractSérialiseur ne peut que Serialiser et désérialiser des types connus, et les types de proxy ne sont pas des types connus. Lorsque vous devez sérialiser les entités POCO, désactivez la création de proxy ou utilisez la classe proxydatacontracTresolver pour sérialiser des objets proxy comme des entités de POCO d'origine. Pour désactiver la création de proxy, définissez la propriété proxycreenédoyable sur FALSE.

Au-delà de cela, vérifiez si vous utilisez Références d'objet interopérables ? Je voudrais essayer cela aussi. Suivez les instructions ici sur la façon de le définir up


0 commentaires

0
votes

sur vos classes de POCO + énumérations et structs (tous sérialisés), vous devez avoir l'attribut Datacontract avec Isreference = TRUE:

[DataContract(Name = "Employee", Namespace = "http://MyNamespace", IsReference=true)]
class Employee
{
    [DataMember(Name="Branch")]
    public Branch _branch = new Branch();
            ... or ...
    [DataMember(Name="Branches")]
    public List<Branch> _branches = new List<Branch>();
}

[DataContract(Name = "Branch", Namespace = "http://MyNamespace", IsReference=true)]
class Branch { ... }


5 commentaires

Les deux attributs sont mis en œuvre, DataContract et DataMember, des centaines de classes de POCO impliquées, toutes fonctionnent bien, c'est le seul endroit où je reçois ce problème.


Juste pour confirmer, le Datacontract utilise Isreference = TRUE?


Oui, ces deux attributs sont sur ma classe [Serializable] [Datacontract (isreference = true)]


Peut-être que c'est trop simpliste, mais avez-vous examiné les résultats des employés.include ("département.branch") avant la sérialisation et vérifiait que tous les indicateurs sont en place?


Oui, je l'ai vérifié plusieurs fois, avant la sérialisation, elle dispose de toutes les données, mais une autre objet similaire de branches est définie sur NULL.



3
votes

Il se peut que les données ne soient pas chargées avant la sérialisation, mais lorsque vous débogez sur le côté serveur, le chargement paresseux entraîne la chargement des données.

Quelques choses que vous pourriez essayer. P>

Ceci obligera la requête à exécuter: P>

context.Entry(Employees).Reference(u => u.Departments.Branch).Load();


0 commentaires

0
votes

sur les classes POCO Utilisez [Datacontract] code> pour la classe, [DataMember] code> pour les propriétés, comme Bahri Gungor em> dit. De plus, vous pouvez écrire des méthodes qui seront appelées par le sérialisateur. Vérifiez MSDN pour: ONDESERIALISÉ A > ONDeséritaire , OnSerialized et OnSerializing

dans WCF- Service dont vous avez besoin d'utiliser un attribut, pour déclarer, où vous souhaitez renvoyer des cours de proxy EF. P>

public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior {
    public ApplyDataContractResolverAttribute() {
    }

    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) {
    }

    public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy) {
        var dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
    }

    public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch) {
        var dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
    }

    public void Validate(OperationDescription description) {
        // Do validation.
    }
}


1 commentaires

J'ai une très grande application, qui fonctionne très bien avec WCF et EF, j'utilise l'attribut [Datacontract] sur ma classe POCO. Et toutes les autres choses fonctionnent complètement bien, c'est le seul scénario exceptionnel où je reçois ce problème.



0
votes

Essayez d'utiliser les deux .include () sur la requête pour charger des objets associés et le [Inclure] attribut dans les métadonnées pour permettre aux objets associés pour que les objets associés soient sérialisés et envoyé au client.

Ce problème (ou au moins similaire) est discuté ici < / p>


1 commentaires

J'utilise Inclure dans la requête et l'événement l'exécutent explicitement en utilisant Tolist () mais cela n'a pas aidé.