2012-07-30 9 views
5

ich ein Modell haben wieEntity Framework Navigationseigenschaften Looping Problem obwohl 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"); 
     }); 
    } 
} 

Alles geht gut, wenn die Entitäten Zugriff auf eine Testkonsolenanwendung verwenden, aber ich brauche diese durch einen WCF-Dienst haben, hier bekam ich Diese Ausnahme:

Fehler beim Aufrufen des Dienstes. Mögliche Ursachen: Der Dienst ist offline oder nicht zugreifbar. Die clientseitige Konfiguration stimmt nicht mit dem Proxy überein. Der vorhandene Proxy ist ungültig. Weitere Informationen finden Sie in der Stack-Ablaufverfolgung für . Sie können versuchen, durch das Starten ein neues Proxy zu erholen, die Wiederherstellung Konfiguration auf dem Standard oder Auffrischen den Service

Die einzige Art, wie ich diese Arbeit gefunden zu haben ist, das Entfernen des Navigator in einen der Einheiten, weil die mit Navigatoren auf beiden Seiten verursachen eine unendliche Schleife.

Gibt es eine Möglichkeit, dies ohne Entfernen der Navigatoren funktionieren zu lassen?

+0

Können Sie den Code der Service-Methode, die bombing out ist? Können Sie die Details der Ausnahme, die Sie erhalten, auch veröffentlichen? – Joon

Antwort

7

Es gibt zwei Probleme, wenn Sie versuchen WCF zu verwenden:

  • Erste Ausgabe: Haben Sie auch kontrollierte Unternehmen zurückkehren wollen? Deaktivieren Sie immer Lazy Loading, wenn Sie mit WCF/Serialisierung arbeiten, und stellen Sie sicher, dass Sie Include für Relationen verwenden, die Sie wirklich zurückgeben möchten. Sonst lädt Lazy Loading alle Relationen im Objektgraphen. Abhängig von der Art und Weise, wie Ihr Service den Lebenszyklus des Kontexts behandelt, kann das Lazy Loading auch auftreten, wenn der Kontext bereits entfernt wurde.
  • Sie müssen den Serializer über den Zirkelverweis informieren oder den Zirkelverweis entfernen. WCF verwendet standardmäßig DataContractSerializer. Um den Zirkelverweis zu entfernen, können Sie eine dieser Navigationseigenschaften mit dem Attribut IgnoreDataMember markieren oder Sie können Serialisierer einfach über den Zirkelverweis informieren, indem Sie alle Objekte mit dem Attribut DataContract(IsReference = true) und allen Elementeigenschaften markieren, die mit dem Attribut DataMember serialisiert werden sollen.
+0

Ist dies immer noch in EF6 gültig? Ich sehe, dass Ihre Antwort inzwischen etwas veraltet ist. Da ich auch automatisch generierte Klassen von der DB und nicht von der Code First-Methode verwende, gibt es immer dieses Problem beim Überschreiben des Datenmodells. Wie gehen wir damit um? (Partielle Klassen sind gut, lösen das Problem der Attribution jedoch nicht auf.) –

+1

@KonradViltersten: Wenn Ihre Klassen automatisch von der T4-Vorlage generiert werden, können Sie die Vorlage direkt ändern, um benötigte Attribute zu erstellen. Dadurch wird sichergestellt, dass die Attribute bei jeder Regenerierung des Modells vorhanden sind. –