我正在尝试编写一个实用程序,它自动在EDMX文档Schema元素中设置ProviderManifestToken属性,但即使我的基本XPath也无法正常工作.我究竟做错了什么? XML: ?xml version="1.0" encoding="utf-8"?edmx:Edmx
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附加到查询中.然后我得到一个null结果.
这是一个完整的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)