2011-02-02 2 views
0

Je ne suis pas sûr comment je peux obtenir les méta-données EntityFramework pour un Entity (j'ai sur mon EF designer/edmx) pour un objet Poco.Est-il possible de déterminer à quelle Entité un Poco correspond, en utilisant du code, pour Entity Framework CTP5?

Par exemple.

Mon diagramme a une entité appelée User. J'ai aussi une classe Poco appelée User. Je suis sous l'impression que le nom de l'entité et Poco doivent être le même nom, donc la convention peut auto-mapper les deux (avec le poco ayant les mêmes noms de propriété, etc ...)

Donc si J'ai un type Poco, comment puis-je récupérer l'entité et donc vérifier cette entité pour voir ses méta-données, comme EntityKey ou StoreGeneratedPattern, etc?

Oh - par la manière ... Je ne sais pas ce que le type Poco .. signifie .. la classe utilise Generics ...

public class GenericRepository<T> : IRepository<T> where T : class 
{ ... } 

, je pensais que j'allais avoir pour demander le contexte ... saisir moi l'entité qui a un name == typeof(T).Name ou autre ...

Répondre

0

Si vous avez accès à l'ObjectContext (que je pense que vous devez avoir, car EntityKey/EntityState n'aurait pas de sens sans le contexte), vous pouvez utiliser les éléments suivants:

ObjectStateEntry ose = 
    context.ObjectStateManager.GetObjectStateEntry(yourObject); 

À partir de là, vous pouvez obtenir toutes sortes de propriétés amusantes: http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.aspx

Vous pouvez également trouver TryGetObjectStateEntry(...) être à portée de main.

+0

heya :) hmm. J'ai certainement accès au Context (qui est un DbContext) .. mais il n'y a pas de propriété ObjectStateManager, dans ce contexte? a-t-il été renommé en CTP5? –

+0

Aussi .. que se passe-t-il si je n'ai aucune entité en mémoire? puis-je encore saisir la structure et interroger les propriétés par rapport à cela? –

+0

Puisque vous utilisez un DbContext, vous pouvez dire (contexte (IObjectContextAdapter)) .ObjectContext – anon

1

L'accès aux métadonnées de mappage est normalement effectué par ObjectContext.MetadataWorkspace. CTP5 cache l'instance ObjectContext et la plupart de ses classes de mappage liées au mappage (basées sur DbMappingMetadataItem) sont internes ou ne contiennent que des membres internes.

Il semble que votre DbContext soit généré automatiquement à partir d'EDMX. Ce que vous pouvez probablement faire dans ce cas est de créer DbContext en appelant le constructeur qui accepte ObjectCotnext. Dans ce cas, vous aurez accès à ObjectContext et à toutes ses méthodes/propriétés.

Pourquoi en avez-vous besoin? Si vous avez besoin de quelque chose de spécial à faire dans votre dépôt, vous devez créer un référentiel spécial pour ce type. Le référentiel générique n'est concept que pour des solutions très basiques.

+0

parce que j'ai un repo générique, j'essaye de trouver l'entité équivalente du poco, que j'ai créée sur le concepteur. Si je peux trouver l'entité équivalente sur le concepteur/MetData, puis trouver la propriété sur cette entité est le premier EntityKey ET StoreGeneratedPattern == Identité, alors je peux faire des choses personnalisées. À l'heure actuelle, j'utilise actuellement une convention pour trouver cette propriété. J'espérais donc utiliser Entity Designer/Metadata à la place de convention. –

+0

Dans ce cas, vous devez simplement modéliser toutes vos entités pour qu'elles contiennent une seule clé avec le même type et le même nom.Ensuite, vous définirez une interface qui demandera une propriété portant le même nom et implémentera cette interface dans toutes vos entités. Votre référentiel générique peut alors utiliser la restriction pour le type générique pour implémenter l'interface et vous aurez un accès direct à la propriété. –

+1

Je ne voulais pas avoir à impliquer mon poco une interface qui est utilisée pour la persistance. Pour moi, c'est une odeur persistante de code sur un poco .. quand un poco ne devrait pas se soucier de la persistance de toute façon. Actuellement, j'utilise une convention -> trouver la première propriété qui se termine par 'Id' et c'est l'identité. Ou vous pouvez définir le nom de la propriété lors de la construction (que gère DI/IoC). Mais ce n'est toujours pas sympa, IMO. Fonctionne - bien sûr. J'espérais utiliser les propriétés de l'EF MetaData .. qui est 100% plus précis. Pensées? –

Questions connexes