2012-07-30 11 views
5

Mam modelu jakEntity Framework Właściwości nawigacji zapętlenie problem chociaż 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"); 
     }); 
    } 
} 

wszystko pójdzie dobrze, gdy dostęp do jednostek za pomocą aplikacji konsoli testowej, ale muszę mieć to za pośrednictwem usługi WCF, tutaj mam ten wyjątek:

Nie powiodło się wywołanie usługi. Możliwe przyczyny: usługa jest niedostępna lub niedostępna; konfiguracja po stronie klienta nie jest zgodna z serwerem proxy ; istniejące proxy jest nieprawidłowe. Więcej szczegółów można znaleźć w opisie stosu dla . Można próbować odzyskać przez rozpoczęciem nowego pełnomocnika, przywracając do domyślnej konfiguracji lub odświeżenia usługę

Jedynym sposobem znalazłem się mieć tej pracy jest usunięcie nawigator w jednej z jednostek, ponieważ mający Nawigatory po obu stronach powodują nieskończoną pętlę.

Czy istnieje sposób, aby to działało bez usuwania nawigatorów?

+0

Czy możesz opublikować kod metody usługi, który jest bombardowany? Możesz również opublikować szczegóły wyjątku, który otrzymujesz? – Joon

Odpowiedz

7

Istnieją dwie kwestie, jeśli spróbujesz użyć WCF:

  • Pierwsza kwestia: Czy chcesz, aby powrócić z podmiotami powiązanymi, jak również? Zawsze wyłączaj leniwy ładowanie podczas pracy z funkcją WCF/serializacji i upewnij się, że ręcznie włączasz opcję Relacje, które naprawdę chcesz zwrócić. W przeciwnym razie leniwy ładunek załaduje całą relację na wykresie obiektu. Co więcej, w zależności od sposobu, w jaki twoja usługa obsługuje cykl życia kontekstu, leniwy ładunek może się zdarzyć, gdy kontekst jest już usunięty.
  • Musisz powiedzieć serializatorowi o okrągłym pliku referencyjnym lub usunąć odwołanie cykliczne. WCF domyślnie używa DataContractSerializer. Aby usunąć odwołanie cykliczne, można oznaczyć jedną z tych właściwości nawigacji za pomocą atrybutu IgnoreDataMember lub po prostu można powiedzieć serializatorowi o okrągłym odwołaniu, zaznaczając wszystkie elementy atrybutem DataContract(IsReference = true) i wszystkie właściwości elementu, które powinny zostać przekształcone do postaci szeregowej za pomocą atrybutu DataMember.
+0

Czy to nadal obowiązuje w wersji EF6? Widzę, że twoja odpowiedź jest już trochę przestarzała. Ponadto, ponieważ używam automatycznie wygenerowanych klas z DB, a nie z metody Code First, zawsze występuje problem z zastąpieniem modelu danych. Jak sobie z tym poradzić? (Częściowe klasy są świetne, ale nie rozwiązują problemu przypisywania.) –

+1

@KonradViltersten: Jeśli twoje klasy są automatycznie generowane przez szablon T4, możesz zmodyfikować szablon bezpośrednio, aby uzyskać potrzebne atrybuty. Zapewni to, że atrybuty będą działać za każdym razem, gdy model się zregeneruje. –

Powiązane problemy