EntityFramework Obtenez de l'objet par ID?
Est-il possible avec les médicaments Génériques pour obtenir un objet de mon EntityFramework sans connaître le type?
Je suis en train de penser à quelque chose le long des lignes de:
public T GetObjectByID<T>(int id)
{
return (from i in myDatabase.T where i.ID == id select i);
}
Est que c'est faisable? Pourrais-je utiliser la Réflexion pour en quelque sorte prendre T.GetType().Name
et l'utiliser pour la table?
MODIFIER
Un autre raccrocher, c'est que pas toutes les tables disponibles afin de me servir de "ID" comme leur unique nom de la colonne.
- Cela peut vous aider: stackoverflow.com/questions/5166297/...
- T n'est pas nécessairement le type d'entité dans ce cas. Il pourrait être un supertype, par exemple,
System.Object
ou d'une procuration sous-type. Vous n'avez pas donné assez d'informations dans votre signature pour résoudre le problème dans tous les cas. - Que les liens a le même problème, c'est en utilisant MVC/DbSets et je suis en utilisant ObjectContext.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir l'interface implémentée par tous vos entités:
et la méthode pour récupérer votre entité:
Vous pouvez également utiliser démarche similaire à celui fourni dans le lié à la question. Vous avez juste à utiliser une autre méthode pour obtenir votre entité:
La différence est que la première méthode de toujours interroger la base de données, même si vous avez déjà chargé l'instance du contexte alors que la deuxième approche vérifie d'abord si l'instance est déjà chargé. La méthode n'est pas efficace, parce qu'il construit ces noms de plus de et plus. Ici est l'approche plus générale qui peut fonctionner avec n'importe quel type de clé et le nom et ici est une approche complexe clés.
Ni de cette méthode directement travaille avec l'héritage - vous devez indiquer le type de base pour le faire fonctionner.
EntityObject
classe.Je pense que le
Find()
méthode peut être en mesure de faire ce que vous cherchez (DbSet.Méthode Find).Il est difficile d'avoir une solution générique, car elles peuvent avoir des clés composites, mais cela fonctionne pour une simple et unique-clés.
La clé est de restreindre
T
pour être de typeSystem.Data.Objects.DataClasses.EntityObject
, qui a alors queEntityKey
de la propriété (ce qui représente la clé primaire).Enfin résolu le problème avec ceci:
http://pastebin.com/kjXUKBNS
Pour appeler le code que j'utilise ceci:
Ce fait l'hypothèse que la Clé Primaire vous sont à la recherche sur est le premier dans la liste des Clés Primaires.
Une autre façon d'obtenir de l'entité à partir de l'id sur entitiy cadre
Résultat
Je pense que cela pourrait aider
Une chose que j'ai fait qui a travaillé à définir un "KeyComparator" interface:
Et puis vous pouvez l'appliquer sur un objet, même avec un multi-valeurs clés:
Et vous pouvez l'utiliser de façon générique si vous fournissez la contrainte:
Le faisant de cette manière vous oblige à avoir une instance de l'objet, même si, bien que vous pouvez remplir vide avec des valeurs de clé et ensuite l'utiliser pour tirer à partir de la DB.
Voici la méthode que j'utilise pour obtenir un objet Entité par ID.
Vous pouvez trouver que c'est une solution plus robuste que certains de ceux prévus ci-dessus. Je l'ai utilisé dans le cadre d'un générique référentiel dans beaucoup de projets. Espérons qu'il vous aide.
GetEntityKey
méthode?