2010-06-03 4 views
3

J'essaie d'écrire un utilitaire qui définit automatiquement l'attribut ProviderManifestToken dans un élément de schéma de document EDMX, mais même mon XPath de base ne fonctionne pas. Qu'est-ce que je fais mal?Comment interroger un modèle EF (document EDMX) avec XPath

Le XML:

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> 
    <!-- EF Runtime content --> 
    <edmx:Runtime> 
    <!-- SSDL content --> 
    <edmx:StorageModels> 
    <Schema Namespace="PvmmsModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005 

Ma tentative:

 var edmx = new XmlDocument();    
     edmx.Load(@"C:\Development\Provantage\PvmmsApp\Model.edmx"); 
     var nsm = new XmlNamespaceManager(edmx.NameTable); 
     nsm.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx"); 

     var x = edmx.SelectSingleNode("//edmx:Edmx/edmx:Runtime/edmx:StorageModels", nsm); 

Cela fonctionne, mais dès que je joins Schema à la requête. Ensuite, je reçois un résultat nul.

Répondre

7

Voici à quoi ressemble un élément complet Schema (votre extrait semble être coupé);

<Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" 
     Namespace="Model1.Store" 
     Alias="Self" 
     Provider="System.Data.SqlClient" 
     ProviderManifestToken="2005"> 

Notez la partie xmlns. Donc, c'est en fait dans un espace de noms, malgré l'absence de préfixe. Maintenant, dans XPath, le manque de préfixe toujours signifie "pas dans n'importe quel espace de noms". Vous aurez donc besoin de lier un préfixe spécifique pour votre XPath, et l'utiliser dans la requête:

... 
nsm.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"); 
var x = edmx.SelectSingleNode(
    "//edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema", nsm) 
+1

Merci d'avoir résolu mon problème, et +1 pour les nouvelles connaissances XPath. – ProfK

Questions connexes