2011-01-26 4 views
2

J'ai un aperçu de la dernière version du code EF via ce tutoriel - http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part4-cs mais je suis un peu confus à propos d'un aspect et je me demande si quelqu'un pourrait faire la lumière dessus? Pour expliquer - il y a une classe appelée "Site" que je veux avoir un champ appelé "HomePageId" qui devrait ensuite correspondre à l'objet "SitePage" avec cet Id. Semble assez simple? Mais quand EF crée le Db et les relations, cela ne semble pas le comprendre. Je suis sûr que c'est quelque chose que je fais mal - voici le code:Problème d'association de clé étrangère automatique du code EF

public class Site 
{ 
    public int SiteId { get; set; } 
    public string SiteName { get; set; } 
    public string SiteUrlPortion { get; set; } 

    // Relationship - SitePages 
    public virtual ICollection<SitePage> SitePages { get; set; } 

    // Relationship - HomePage 
    public int HomePageId { get; set; } 
    public virtual SitePage HomePage { get; set; } 
} 

public class SitePage 
{ 
    public int SitePageId { get; set; } 
    public string SitePageTitle { get; set; } 
    public string SitePageUrlPortion { get; set; } 

    // Relationship - Site 
    public int SiteId { get; set; } 
    public virtual Site Site { get; set; }  
} 

La classe « SitePage » génère la relation de retour à « Site », comme on peut s'y attendre. Mais ce que j'ai en termes de colonnes dans les deux tableaux non seulement n'a pas de sens, mais la relation du côté du code des choses ne fonctionne pas comme prévu. (Par exemple, quand je donne un "HomePageId" au "Site", le "HomePage" du site est nul.)

De toute évidence, il y a peu de documentation là-dessus, car elle est encore en développement, mais je me demandais si quelqu'un avait des idées? Ai-je besoin de commencer à décorer les propriétés avec des attributs? Ou est-ce que je lui demande de comprendre quelque chose qu'il ne le fera jamais ?!

Rob

Répondre

0

Il s'agit probablement d'une limitation dans EF, qui ne peut gérer qu'une seule relation entre deux tables:

Vous avez 2 relations entre les tables, à la liste des pages du site et à la page d'accueil.

essayez de supprimer cette ligne:

public virtual SitePage HomePage { get; set; } 

Vous avez toujours la homepageid, d'une manière cette information était superflue.

+0

Salut, merci pour la réponse. Je sais ce que vous dites mais ensuite je vais devoir faire une autre requête comme "sitePages.Single (p => p.SitePageid == this.HomePageId)" quelque part - peut-être dans la classe d'entité HomePage elle-même qui me dérange - Je vais essayer quand même! – LiverpoolsNumber9

+0

Et en fait cela jette l'erreur - "Il y a déjà un DataReader ouvert associé à cette commande qui doit être fermé en premier.". La réponse peut être de créer une entité distincte appelée "HomePages". Je vais essayer ça maintenant. – LiverpoolsNumber9

+0

Vérifiez également que la chaîne de connexion MultipleActiveResultSets est définie sur true. –

1

essayer le marquage de votre propriété HomePage avec un attribut ForeignKey comme celui-ci

[Foreignkey("HomePageId")] 
public virtual SitePage HomePage { get; set; } 

vous pouvez aussi utiliser la configuration couramment, mais ne me souviens pas que désinvolture

+0

Salut Tom - merci pour cette suggestion. J'ai essayé mais avec les mêmes résultats. Restez coincé avec un work-around maintenant - deux colonnes non-clés "Home page id" et "page d'accueil" - ce n'est pas idéal mais comme ce sont les deux seules données dont j'ai vraiment besoin, ce n'est pas un train avoir l'objet "HomePage" entièrement formé là-bas .. – LiverpoolsNumber9

Questions connexes