2009-06-21 10 views
3

J'essaie de filtrer les entités en fonction de leurs types de magasin (table ou vue).Comment obtenir le type de magasin d'un ensemble d'entités

J'ai 2 entités dans mon projet de test, sa source est une table et la source de l'autre est une vue.

<EntitySet Name="Test" EntityType="TestModel.Store.Test" store:Type="Tables" Schema="dbo" /> 
<EntitySet Name="TestView" EntityType="TestModel.Store.TestView" store:Type="Views" store:Schema="dbo" store:Name="TestView"> 

L'exemple de code ci-dessus est tirée de section SSDL du fichier edmx de modèle.

Je pense que le stocker: Type informations en SSDL est ce dont j'ai besoin, mais je ne pouvais pas trouver un moyen de récupérer cette valeur en utilisant API-framework api.

Toute aide sera appréciée.

Répondre

2

Eh bien, vous pouvez interroger les métadonnées dans la SSDL en regardant dans le SSpace ou le StoreItemCollection.

à savoir

var sspaceEntitySets = context.MetadataWorkspace 
         .GetItems<EntityContainer>(DataSpace.SSpace) 
         .First().BaseEntitySets.OfType<EntitySet>(); 
var entitySet = sspaceEntitySets.First(); 
var tableType = entitySet 
.MetadataProperties["http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type"] 
.Value.ToString(); 

Malheureusement, cela ne va pas pour vous aider à attacher vos classes si elles proviennent d'une table ou d'une vue. Parce que les Entités (c.-à-d. Celles que vous codez dans CSpace) plutôt que celles qui décrivent les formes de la table (ie SSpace) sont dans CSpace et pour savoir si une Entité provient d'une vue ou d'une table, vous aurez besoin pour pouvoir accéder à CSpace EntitySet à SSpace EntitySet via le mappage.

Malheureusement, l'EF n'expose pas le CSSPace public (c'est-à-dire qu'il n'y a aucun moyen d'utiliser l'API pour lire le fragment MSL de l'EDMX). Donc, pour ce faire, vous devrez raisonner manuellement sur l'élément MSL, en utilisant probablement LINQ to XML ou quelque chose comme ça.

Hope this helps

Alex

+0

var = sspaceEntitySets context.MetadataWorkspace .GetItems (DataSpace.SSpace) .Premier() BaseEntitySets.OfType (). cette ligne lève l'exception InvalidOperation en disant "L'espace" SSpace "n'a aucune collection associée." – Cankut

+0

Merci Alex, j'ai eu l'erreur ci-dessus parce que SSDL n'est pas chargé jusqu'à ce qu'il soit nécessaire. Un petit "ToTraceString()" a résolu le problème. http://thedatafarm.com/blog/data-access/quick-trick-for-forcing-metadataworkspace-itemcollections-to-load/ – Cankut

+0

EF 4.1 introduira-t-il l'espace CSS dans l'API? Le cas d'utilisation tente de traduire des exceptions SQL inattendues en descirptions d'erreurs d'entités plus utiles. Par exemple: "Impossible d'insérer la valeur NULL dans la colonne 'fstnam', la table 'ppl'" dans "Une personne ne peut pas avoir la valeur NULL comme prénom" –