éditer # 2: Question résolue à mi-chemin. Comme question de suivi, est-ce que quelqu'un connaît une façon non intrusive de résoudre ce que j'essaie de faire ci-dessous (à savoir, relier les objets les uns aux autres sans déclencher des boucles infinies)? Je tente de créer une application Web asp.net-mvc et d'obtenir une exception StackOverFlowException. Un dispositif de commande déclenche la commande suivante:StackOverflowException causée par une requête linq
public ActionResult ShowCountry(int id)
{
Country country = _gameService.GetCountry(id);
return View(country);
}
Le GameService il gère comme cela (WithCountryId est une extension):
public Country GetCountry(int id)
{
return _gameRepository.GetCountries().WithCountryId(id).SingleOrDefault();
}
Le GameRepository Il gère la manière suivante:
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;
}
Les GetGames() méthode provoque l'exception StackOverflowException:
public IQueryable<Game> GetGames()
{
var games = from g in _db.Games
select new Game
{
Id = g.Id,
Name = g.Name
};
return games;
}
Mes objets métier sont différents des classes linq2sql, c'est pourquoi je les remplis avec un nouveau select.
Une exception non gérée du type 'System.StackOverflowException' est produite dans mscorlib.dll
modifier # 1: J'ai trouvé le coupable, il est la méthode suivante, il déclenche la méthode GetCountries() qui en retour déclenche les GetSubRegions() à nouveau, 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))
};
}
aurait peut-être penser à quelque chose d'autre ici :) Voilà ce qui se passe quand vous pensez dans un état d'esprit de OO à cause de trop de café
OMG, quand j'ai vu cette question sur la première page, j'ai pensé qu'il y avait un problème sur ce site. – OregonGhost
+1 pour poser une question à propos de StackOverflowExceptions sur StackOverflow – kbrinley