2

Je travaille avec EF 4.1 CTP5 et SQL Server 2008. Je dois comprendre comment résoudre un problème de récurrence. J'ai les 2 classes suivantes:Problème de récurrence Entity Framework

public class Nation 
{ 
    public int ID {get; set;} 
    public string name {get;set;} 
    public List<NationAlly> NationAllies {get;set;} 
} 

public class NationAlly 
{ 
    public int ID {get; set;} 
    public int level {get;set;} 
    public Nation Owner {get; set;} 
    public Nation toNation {get;set;} 
} 

Les entités sont mis en correspondance avec la base de données avec deux tables (Nations et NationAllies). De plus, il y a deux relations. 1) De NationAllies.OwnerID à Nation.ID 2) De NationAllies.ToNationID à Nation.ID

Lorsque je tente de récupérer un objet de type Nation de ma base de données, j'accéder à la classe DbContext NationDB:

Nation selectedNation = ((nationDB.Nations.Include("NationAllies")).Where(m => m.name == "France")).FirstOrDefault(); 

Le problème est que j'obtiens un objet selectedNation qui a une liste de NationAllies mais chaque NationAlly de la liste a le champ toNation = null. Tout d'abord, j'aimerais que le champ toNation récupère les informations correctes de la base de données. Comment puis-je faire cela? Ensuite, bien sûr, la Nation sera connectée à d'autres nations qui, à leur tour, auront une autre nation. Comment pourrait-on construire une carte récursive? Mon idée est de naviguer sur la carte jusqu'à un certain niveau, en interrogeant la base de données d'une manière spécifique. Ce faisant, quelle serait la meilleure approche pour avoir une bonne performance de vitesse?

+0

Comment mapper ces entités. Tout d'abord, votre code ne corespond pas à votre requête car 'name' dans' Nation' est un entier. Le mappage par défaut pointera 'toNation' vers l'entité parente qui est dans votre cas France. Il n'y aura pas de récursivité. –

+0

1) Correction du type erroné dans Nation.name 2) Ajout de la description sur le mappage – Francesco

+0

@Ladislav: vous avez la récursion dans le sens que chaque nation peut avoir plusieurs Nation (s). Chaque nation a une nation dans le domaine des nations, qui, à son tour, peut avoir plusieurs nationalités. Dans ce cas, une organisation hiérarchique entière ou une carte est créée. Les limites de la carte peuvent bien entendu être finies (se terminant par des "feuilles" qui ne produisent pas de nouvelles branches, c'est-à-dire des Nations sans Alliés) ou infinies (Nations toutes interconnectées entre elles) – Francesco

Répondre

2

On dirait que NationAllies est une table de jonction avec des propriétés supplémentaires. Le problème est que EF ne souhaite pas charger les propriétés de navigation imbriquées si vous ne les spécifiez pas explicitement dans la méthode Include. Si vous voulez avoir rempli tonation vous devez utiliser

nationDB.Nations.Include("NationAllies.toNation") 

ou

nationDB.Nations.Include(n => n.NationAllies.Select(na => na.toNation)) 

Vous pouvez également activer le chargement paresseux. Faites toutes vos propriétés de navigation virtual (toNation, NationOwner et NationAllies) et à moins que vous ne fermiez le contexte, toutes les propriétés seront chargées une fois que vous y avez accédé.

+0

Amende. Problème résolu en utilisant l'approche # 1. L'approche n ° 2 a l'air très intéressante: si j'ai bien compris, le contexte va charger en mémoire les objets quand je vais y accéder? Cela signifie que, par exemple, la propriété toNation récupère automatiquement les valeurs de la base de données lorsque je "navigue sur la carte" vers cette propriété? – Francesco

+0

Oui c'est l'exécution paresseuse de l'instruction select dans la base de données. –

+0

Cela fonctionne comme un charme! Génial! Merci! – Francesco

Questions connexes