我正在尝试编写一个在EDMX文档Schema元素中自动设置ProviderManifestToken
属性的实用程序,但即使是我的基本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
附加到查询中即可。然后我得到一个空结果。
答案 0 :(得分:7)
以下是完整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)