2012-07-30 11 views
5

Ho un modello comeEntity Framework proprietà di navigazione problema looping se WCF

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Group> Memberships { get; set; } 
} 

public class Group 
{ 
    [Key] 
    public long GroupId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Members { get; set; } 
} 

public class DataContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Group> Groups { get; set; } 

    public DataContext() 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
     .HasMany(u => u.Memberships) 
     .WithMany(t => t.Members) 
     .Map(x => 
     { 
      x.MapLeftKey("UserId"); 
      x.MapRightKey("GroupId"); 
      x.ToTable("GroupMembers"); 
     }); 
    } 
} 

tutto va bene quando si accede entità utilizzando un'applicazione console di prova, ma ho bisogno di avere questo attraverso un servizio WCF, qui ho ottenuto questa eccezione:

Impossibile richiamare il servizio. Possibili cause: il servizio è offline o inaccessibile; la configurazione lato client non corrisponde al proxy ; il proxy esistente non è valido. Fare riferimento allo stack trace per maggiori dettagli. Si può cercare di recuperare avviando un nuovo proxy, ripristinando alla configurazione di default, o rinfrescante il servizio

L'unico modo che ho trovato per avere questo lavoro è, rimuovendo il navigatore in una delle entità, perché avere la i navigatori su entrambi i lati provocano un loop infinito.

C'è un modo per farlo funzionare senza rimuovere i navigatori?

+0

Puoi pubblicare il codice del metodo di servizio che sta bombardando? Inoltre, puoi pubblicare i dettagli dell'eccezione che stai ricevendo? – Joon

risposta

7

Ci sono due problemi se si tenta di utilizzare WCF:

  • Prima edizione: Volete tornare entità collegate come bene? Disattivare sempre il caricamento lento quando si lavora con WCF/serializzazione e assicurarsi di utilizzare manualmente Include per le relazioni che si desidera davvero restituire. In caso contrario, il caricamento lazy caricherà tutta la relazione nel grafico dell'oggetto. Inoltre, a seconda del modo in cui il servizio gestisce il ciclo di vita del contesto, il caricamento lento può verificarsi quando il contesto è già disposto.
  • È necessario comunicare al serializzatore il riferimento circolare o rimuovere il riferimento circolare. WCF per impostazione predefinita utilizza DataContractSerializer. Per rimuovere il riferimento circolare, puoi contrassegnare una di quelle proprietà di navigazione con l'attributo IgnoreDataMember oppure puoi semplicemente comunicare al serializzatore il riferimento circolare contrassegnando tutte le entità con l'attributo DataContract(IsReference = true) e tutte le proprietà dei membri che devono essere serializzate con l'attributo DataMember.
+0

È ancora valido in EF6? Vedo che la tua risposta è un po 'datata ormai. Inoltre, poiché utilizzo classi autogenerate dal DB e non dal metodo Code First, c'è sempre questo problema con la sovrascrittura del modello dati. Come possiamo farcela? (Le classi parziali sono ottime ma non risolvono il problema di attribuzione.) –

+1

@KonradViltersten: Se le tue classi sono generate automaticamente da un modello T4, puoi modificare direttamente il modello per produrre gli attributi necessari. Ciò garantirà che gli attributi siano presenti ogni volta che il modello si rigenera. –

Problemi correlati