2012-02-14 10 views
9

Sto lavorando su un'applicazione, utilizzando Entity Framework 4.0. e WCF.Problema di deserializzazione in Entity Framework 4.0

sto elenco di oggetti tornando dire (Lavoratori)

e la proprietà di navigazione di tale oggetto è dire (Dipartimenti)

e attrezzature ha inoltre una struttura di navigazione (Branch)

Sono compreso tutto come

Employees.include("Departments.Branch"); 

emissione Ora th tutti quei reparti il ​​cui ramo è lo stesso, è impostato su null (tranne il primo) su deserializzazione su WCF.

Ho bisogno di utilizzare il ramo per alcuni scopi vincolanti, gentilmente guidami come dovrei liberarmi di questo problema.

Questa è la schermata delle entità enter image description here

+0

Dou si utilizza entità auto-Tracking? –

+0

No, queste sono normali entità POCO – MegaMind

+0

Se lo si profila sul lato server quale sarebbe l'output? sta avendo valori corretti? – marvelTracker

risposta

0

Si potrebbe provare a utilizzare profiler Entity Framework e vedere se query generata è avere dati validi. http://efprof.com/

+0

Questo accade solo con la deserializzazione, quindi niente che un profiler potrebbe fare per me. – MegaMind

+0

Ok. Quindi provare a definire Membro dati con i nomi specificati e Ordinarli con gli attributi, poiché si verifica un problema di deserializzazione. – marvelTracker

0

Da MSDN

Windows Communication Foundation (WCF) non può serializzare direttamente o deserializzare proxy perché il DataContractSerializer può che serializzare e deserializzare tipi conosciuti, e tipi di proxy non sono noti i tipi. Quando è necessario serializzare le entità POCO, disabilitare la creazione del proxy o utilizzare la classe ProxyDataContractResolver per serializzare oggetti proxy come entità POCO originali. Per disabilitare la creazione del proxy, impostare la proprietà ProxyCreationEnabled su false.

Oltre a ciò, verificare se si utilizza Interoperable Object References? Lo proverei anche io. Seguire le istruzioni here su come configurarlo

0

Sulle vostre classi POCO + enumerazioni e struct (tutti di loro che sono serializzati), è necessario che l'attributo DataContract con 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 { ... } 

E ' IsReference = true è quello che assicura che tutti i puntatori vengano convertiti in riferimenti durante la serializzazione. Assicurati inoltre che i tuoi riferimenti abbiano un attributo DataMember.

+0

Entrambi gli attributi sono implementati, DataContract e DataMember, ci sono centinaia di piccole classi coinvolte, tutto funziona bene, questo è l'unico posto dove sto riscontrando questo problema. – MegaMind

+0

Giusto per confermare, DataContract utilizza IsReference = true? –

+0

Sì, questi due attributi sono sulla mia classe [Serializable] [DataContract (IsReference = true)] – MegaMind

3

È possibile che i dati non vengano caricati prima della serializzazione, ma quando si esegue il debug sul lato server, il caricamento lento causa il caricamento dei dati.

Un paio di cose che potreste provare.

Questo costringerà la query da eseguire:

Employees.include("Departments.Branch").ToList(); 

Questo caricherà in modo esplicito le entità:

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

Sulle poco-classi di uso [DataContract] per la classe, [DataMember] per le proprietà, come Bahri Gungor ha detto.Inoltre è possibile scrivere alcuni metodi, che verranno chiamati dal serializzatore. Controllare MSDN per: OnDeserializedOnDeserializing, OnSerialized e OnSerializing

In WCF-Service è necessario utilizzare un attributo, per dichiarare, in cui si desidera tornare EF-Proxy-Classes.

[ApplyDataContractResolver] 
public POCO_CLASS GetById(int id){ 
    // your code here... 
} 

E l'ApplyDataContractResolver assomiglia:

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. 
    } 
} 

Sfondo è che la WCF puntate con una DataContractSerializer e EF costruisce Proxy-Classes per tenere traccia delle modifiche.

Ecco un link per MSDN per ProxyDataContractResolver: MSDN

+0

Ho un'applicazione molto grande, che funziona molto bene con WCF e EF, sono utilizzando l'attributo [DataContract] sulla mia classe PoCo. e tutte le altre cose funzionano perfettamente, questo è l'unico scenario eccezionale in cui sto riscontrando questo problema. – MegaMind

0

Tenta di utilizzare sia .Include() sulla query per caricare oggetti correlati e l'attributo [Include] nei metadati per consentire quegli oggetti legati da serializzare e inviati al client.

Questo problema (o almeno simili) viene discusso here

+0

Sto usando include nella query e l'evento lo eseguo esplicitamente utilizzando ToList() ma ciò non ha aiutato. – MegaMind

+0

È utile? http://msdn.microsoft.com/en-us/library/ee705457.aspx –

Problemi correlati