2010-11-30 14 views
12

Nous utilisons WCF Data Service basé sur un modèle Entity Framework pour notre application.HierarchyID dans Entity Framework ne fonctionne pas

Dans cela, nous devons ajouter la table avec une colonne de type HierarchyId. Lorsque j'ajoute cette table au fichier EDMX, la colonne HierarchId n'apparaît pas dans le fichier de classe. Comment faire pour utiliser HierarchyID? J'ai lu que Entity Framework ne prend pas en charge HierarchyID, alors comment puis-je y parvenir?

+2

Votre problème est avec EF, pas WCF. Le problème est que EF ne peut pas représenter les colonnes hierarchyid. – Gabe

+0

J'ai utilisé ce petit bout de code pour rendre le travail avec les chaînes HierarchyID un peu plus facile ... http://stackoverflow.com/questions/3347860/is-there-a-practical-way-to-use-the-hierarchyid- datatype-in-entity-framework-4 – EBarr

+0

@EBarr, Votre implémentation semble bonne, mon exigence était simplement d'utiliser le HierarchyID existant tel qu'il est. La seule chose que j'ai fait était, utilisé la colonne calculée puisque EF ne supporte pas. Par l'utilisation de la colonne calculée, il fait son travail génial. – Mohanavel

Répondre

24

Vous pouvez toujours convertir un HierarchyId en sa représentation sous forme de chaîne - quelque chose comme /1/3/4/1 - et envoyer cette chaîne à travers le service de données WCF.

Mise à jour: si vous ajoutez cette calculé, a persisté colonne à votre table SQL Server, cette nouvelle colonne devrait certainement apparaître dans votre modèle EF et vous devriez être en mesure d'utiliser pour le renvoyer sur WCF et WCF données services:

ALTER TABLE dbo.YourTable 
ADD HierarchyString AS (your hierarchyID field).ToString() PERSISTED 

Mise à jour # 2:read the docs! Vous pouvez analyser une chaîne comme /1/3/4/1 en un type HierarchyId - utilisez les méthodes HierarchyId::Parse(string) ou CAST(string as HierarchyId) habituelles pour ce faire.

+0

Comme je l'ai dit plus tôt, tout en ajoutant la table au fichier EDMX, le champ hierarchyId n'apparaît pas. Donc, je dois avoir la méthode dans le fichier svc et insérer en utilisant "insérer dans ..." requête? – Mohanavel

+1

OK, cela peut être utilisé comme getter, que diriez-vous de setter? J'ai essayé le genre de choses de setter. Si setter est possible, tout peut être fait de manière plus simple. En utilisant cela, je suis en mesure d'obtenir les données. Merci marc_s. – Mohanavel

+0

@Mohanavel: mis à jour ma réponse encore une fois ..... –

10

Si vous utilisez la colonne calculée garder juste à l'esprit que vous aurez également besoin de l'annotation de données DatabaseGenerated sur votre propriété comme ceci:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string HierarchyString { get; set; } 

Vérifiez cet article pour plus d'informations: Entity Framework Code First Computed Properties