Как запросить модель EF (документ EDMX) с XPath - PullRequest
3 голосов
/ 03 июня 2010

Я пытаюсь написать утилиту, которая автоматически устанавливает атрибут ProviderManifestToken в элементе схемы документа EDMX, но даже мой базовый XPath не работает. Что я делаю не так?

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

Моя попытка:

        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);

Это работает, но как только я добавляю Schema к запросу. Тогда я получаю нулевой результат.

1 Ответ

7 голосов
/ 04 июня 2010

Вот как на самом деле выглядит элемент Schema (ваш фрагмент выглядит обрезанным);

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

Обратите внимание на xmlns часть. Так что это на самом деле в пространстве имен, несмотря на отсутствие префикса.

Теперь в XPath отсутствие префикса всегда означает «не в любом пространстве имен». Поэтому вам нужно привязать некоторый префикс специально для вашего XPath и использовать его в запросе:

...
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...