2012-07-30 32 views
5

tengo un modelo comopropiedades de navegación Entity Framework tema bucle aunque 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"); 
     }); 
    } 
} 

todo va bien cuando se accede a las entidades utilizando una aplicación de consola de prueba, pero tengo que tener esto a través de un servicio WCF, aquí tengo esta excepción:

Error al invocar el servicio. Causas posibles: el servicio está fuera de línea o inaccesible; la configuración del lado del cliente no coincide con el proxy ; el proxy existente no es válido. Consulte el seguimiento de la pila para más detalles. Se puede tratar de recuperar iniciando un nuevo proxy, restaurando a la configuración predeterminada, o actualizar el servicio

La única manera que encontró que este trabajo es, eliminando el navegador en una de las entidades, porque tener la los navegantes en ambos lados causan un bucle infinito.

¿Hay alguna manera de que funcione sin quitar los navegadores?

+0

¿Puedes publicar el código del método de servicio que está bombardeando? Además, ¿puede publicar los detalles de la excepción que está recibiendo? – Joon

Respuesta

7

Hay dos problemas si intenta utilizar WCF:

  • Primera cuestión: ¿Quieres volver a entidades relacionadas, así? Siempre apague la carga diferida cuando trabaje con WCF/serialización y asegúrese de usar manualmente Incluir para las relaciones que realmente desea devolver. De lo contrario, la carga diferida cargará todas las relaciones en el gráfico de objetos. Además, dependiendo de la forma en que su servicio maneje el ciclo de vida del contexto, la carga diferida puede ocurrir cuando el contexto ya está dispuesto.
  • Debe indicar al serializador acerca de la referencia circular o eliminar la referencia circular. WCF usa por defecto DataContractSerializer. Para eliminar la referencia circular puede marcar una de esas propiedades de navegación con el atributo IgnoreDataMember o puede simplemente decirle al serializador acerca de la referencia circular marcando todas las entidades con el atributo DataContract(IsReference = true) y todas las propiedades de miembro que se deben serializar con el atributo DataMember.
+0

¿Esto todavía es válido en EF6? Veo que tu respuesta ya está un poco anticuada. Además, dado que estoy usando clases autogeneradas desde DB y no con el método Code First, siempre existe el problema de sobrescribir el modelo de datos. ¿Cómo lidiamos con eso? (Las clases parciales son geniales, pero no resuelven el problema de atribución). –

+1

@KonradViltersten: si sus clases se autogeneran mediante la plantilla T4, puede modificar la plantilla directamente para producir los atributos que necesita. Eso asegurará que los atributos estarán en su lugar cada vez que el modelo se regenere. –

Cuestiones relacionadas