2009-07-23 7 views
0

J'utilise Entity Framework comme ORM pour une application ASP.Net (webforms). Supposons que j'ai un ensemble de pages "liste/détail" dans mon application, lorsque vous cliquez sur une ligne dans la page de liste, je voudrais passer un identifiant de type pour cette ligne à une page de détail, que j'utiliserais ensuite charger la ligne à partir de ma couche de données. Dans mon cas spécifique, la clé primaire est simplement une colonne d'identité "rowId". Cependant, EF semble préférer "cacher" les clés primaires/étrangères de sorte que vous n'ayez pas accès à celles-ci (par défaut). Je suis nouveau à EF, et je me demande s'il existe une meilleure pratique pour identifier de façon unique une ligne en dehors du contexte de l'entité. J'imagine que je pourrais ajouter une colonne uniqueidentifier à mon enregistrement et une propriété correspondante à mon modèle d'entité, mais il semble redondant pour avoir effectivement 2 identifiants uniques pour la ligne. Existe-t-il un meilleur moyen de contourner un identifiant sur la couche de présentation?Comment identifier une entité de manière unique dans Entity Framework?

Dans mon gestionnaire d'événements _ItemDataBound(), je pense que je peux faire quelque chose comme:

var announcement = (Announcement) e.Item.DataItem; 
string rowID = announcement.EntityKey.EntityKeyValues[0].Value.ToString(); 

Est-ce recommandé, ou tout simplement travailler contre le cadre?

Merci d'avance.

Scott

Répondre

1

Non, ce que vous faites ne "travaille contre le cadre (entité)." Cela ne veut pas dire qu'il ne pouvait pas être améliorée, cependant:

  1. Je sais que ce n'est pas MVC, mais même dans WebForms je pense toujours que c'est une bonne idée d'avoir une certaine séparation entre votre couche de données et votre web pages J'utiliserais probablement le modèle Repository avec un modèle de présentation ici plutôt que de donner à la page une connaissance directe de Entity Framework.
  2. Étant donné que vous avez déjà casté l'annonce dans son type approprié, vous pouvez accéder directement à la valeur d'ID, plutôt que de passer par EntityKey. Ensuite, au moins, votre page a uniquement connaissance de l'annonce au lieu de Entity Framework.
  3. Le code actuel suppose qu'il existe un EntityKey (pas toujours vrai, en particulier avec les entités nouvellement insérées qui n'ont pas encore été validées dans la base de données) et qu'il n'a qu'une seule colonne. C'est une bonne idée de tester ces présomptions et de lancer une exception significative au lieu de les laisser exploser avec une référence nulle si elles sont violées.
+1

L'implémentation du modèle de référentiel allait en fait être mon prochain refactoring :) Je ne suis pas sûr d'où j'ai eu l'impression que la propriété .RowID ne serait pas disponible pour moi ... cela fonctionne bien pour moi dans ce cas. Bon point sur # 3 ... Je suis nouveau à EF et de sentir ce que je devrais et ne devrais pas faire avec elle. –

Questions connexes