Frage

Bearbeiten # 2: Frage gelöst halbe Strecke. Schauen Sie unten

Als Folgefrage, weiß jemand, eines nicht-intrusive Weise zu lösen, was ich versuche, unten (nämlich Objekte miteinander verknüpfen, ohne Endlosschleifen Triggerung) zu tun?


ich versuche, eine asp.net-mvc Web-Anwendung zu erstellen, und eine Stackoverflow bekommen. Ein Controller löst den folgenden Befehl ein:

    public ActionResult ShowCountry(int id)
    {
        Country country = _gameService.GetCountry(id);
        return View(country);
    }

Die GameService behandelt es wie folgt aus (WithCountryId ist eine Erweiterung):

    public Country GetCountry(int id)
    {
        return _gameRepository.GetCountries().WithCountryId(id).SingleOrDefault();
    }

Die GameRepository behandelt es wie folgt aus:

    public IQueryable<Country> GetCountries()
    {
        var countries =  from c in _db.Countries
               select new Country
               {
                   Id = c.Id,
                   Name = c.Name,
                   ShortDescription = c.ShortDescription,
                   FlagImage = c.FlagImage,
                   Game = GetGames().Where(g => g.Id == c.GameId).SingleOrDefault(),
                   SubRegion = GetSubRegions().Where(sr => sr.Id == c.SubRegionId).SingleOrDefault(),
               };
        return countries;
    }

Die GetGames () Methode bewirkt, dass die Stackoverflow:

    public IQueryable<Game> GetGames()
    {
        var games = from g in _db.Games                   
               select new Game
               {
                   Id = g.Id,
                   Name = g.Name

               };
        return games;

    }

My Business-Objekte unterscheiden sich von den linq2sql Klassen, deshalb habe ich sie mit einer ausgewählten neuen füllen.

Eine nicht behandelte Ausnahme des Typs 'System.StackOverflowException' ist in mscorlib.dll aufgetreten


Bearbeiten # 1: Ich habe den Täter gefunden, es ist die folgende Methode, löst es die GetCountries () -Methode, die im Gegenzug die GetSubRegions auslöst () erneut, ad nauseam:

    public IQueryable<SubRegion> GetSubRegions()
    {
        return from sr in _db.SubRegions
               select new SubRegion
               {
                   Id = sr.Id,
                   Name = sr.Name,
                   ShortDescription = sr.ShortDescription,
                   Game = GetGames().Where(g => g.Id == sr.GameId).SingleOrDefault(),
                   Region = GetRegions().Where(r => r.Id == sr.RegionId).SingleOrDefault(),
                   Countries = new LazyList<Country>(GetCountries().Where(c => c.SubRegion.Id == sr.Id))
               };
    }

Könnte sonst hier an etwas zu denken haben :) Das ist, was passiert, wenn man in einer OO-Mentalität denken, weil zu viel Kaffee

War es hilfreich?

Lösung

Das Problem könnte sein: Länder haben Subregionen und Subregionen haben Länder. Ich weiß nicht, wie Sie die faul Liste implementieren, aber das könnte Aufruf GetCountries hält und dann GetSubRegions und so weiter. Um das herauszufinden, würde ich den Debugger en Satz Haltepunkte auf dem GetCountries und GetSubRegions Methode Header starten.

Ich habe versucht, ähnliche Muster mit LinqToSql, aber es ist schwer, ohne die Leistung zu viel bidirektionale Navigation funktioniert. Das ist einer der Gründe, warum ich verwende NHibernate jetzt.

Andere Tipps

Hai! Ich denke, Ihre Modelle unbeabsichtigt rekursiv Aufruf eine Methode, die in dem Stapelüberlauf führt. Wie zum Beispiel Ihres Subregion Objekt versucht, Land Objekte zu erhalten, die wiederum Subregionen zu bekommen.

Wie auch immer, es hilft immer, den Stapel in einer Stackoverflow Ausnahme zu überprüfen. Wenn Sie ein Objekt sehen, auf die zugegriffen immer und immer wieder, seine sehr wahrscheinlich, weil Sie so etwas wie dies tun:

public object MyProperty {set {MyProperty = Wert; }}

Es ist einfacher zu Situationen wie die Ihre vor Ort, wo das Verfahren Verfahren B ruft die Methode A ruft, weil Sie die gleichen Methoden zwei oder mehr Male in dem Call-Stack zeigen nach oben sehen können.

Ihre editierten Frage zu beantworten, nämlich: „Objekte miteinander verknüpfen, ohne dass dadurch Endlosschleifen“:

Angenommen, Sie irgendeine Art von Beziehung haben, wo beide Seiten über die anderen wissen müssen ... habhaft alle relevanten Einheiten in beiden Seiten, dann verbinden sie zusammen, anstatt zu versuchen, die Abruf- von einer Seite zu machen automatisch die andere holen. Oder einfach machen ein Seite der andere holt, und dann die restlichen beheben. Also in Ihrem Fall würden die Optionen sein:

Option 1:

  • Liefert alle Länder (Abfahrt Subregionen leer)
  • Liefert alle Subregionen (Abfahrt Länder leer)
  • Für jede Subregion, schauen Sie durch die Liste der Länder und die Subregion zu dem Land und das Land an der Subregion
  • hinzufügen

Option 2:

  • Liefert alle Länder (Abfahrt Subregionen leer)
  • Liefert alle Subregionen, Subregion.Countries über die Länderliste geholt oben
  • Einstellung
  • Für jeden Teilbereich, gehen durch alle seine Länder und fügen Sie ihn in diesem Land

(oder umgekehrt Länder und Teilregionen)

Sie sind im Grunde equialent Antworten, es ist nur ändert, wenn Sie einen Teil der Verknüpfung tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top