最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表、主外键及每个字段的属性。先简单描述我解决这个问题从开始到最后的分析实现过程。EF框架实际是由XML模型建立的。如图一所示:

图1 EF文件

将EF框架EDM文件(TestModel.edmx文件)使用xml编辑器打开,可以看到其XML结构,其结构主要如下所示:

EDM是实体数据关系映射的XML文件。EDM主要有三部分构成 CSDL,SSDL,MSL。

  1. CSDL表面的是实体数据模型结构,
  2. SSDL表示对应的数据存储的架构,
  3. CSDL实体与SSDL数据结构的关系通过MSL映射实现。

EDM是通过ADO.NET 实体数据模型生成的。简单的了解了EF框架的本质之后,首先选择了XML的处理方式(开始不了解元数据,之后会有描述),因为这是EF框架的根源,从根源入手,肯定会解决问题。在实现第一次方案之前,有必要对数据库设计进行简要的说明,在数据库设计的时候需要对字段,表设计时相关属性要尽量完善,包括说明、字段长度、是否为空等,在这有一个问题就是我们直接在数据库中写字段、表说明是无法生成EF框架内相应说明的,所有我们需要使用EFTSQLDocumentation.Generator.exe工具,具体使用方法,此处不再赘述。需要在EDM中显示字段,表的中文说明的,使用此工具即可,我们主要是为了在MVC的view生成时,可以直接生成中文标签,才需要此功能。

通过以上描述,我们基本上知道了,我们就是要通过关系映射XML文件完成我们的最初目标,最初我们使用了Xpath,XQuery技术对XML文件进行处理,基本达到了最初的要求,但是这种方式,处理起来太繁琐,后来又尝试了Linq to Entity的方式对xml进行处理,这种方式其实也是换汤不换药。使用直接操作xml的读取方式的确很直接,很容易。但是随着测试完成,数据库不断扩容,眼前的XML文件日渐庞大,想对每个节点进行操作,简直苦不堪言!思来想去,如果有一套直接操作EDM元数据的API就好了,元数据就是用来定义数据的数据,之前尽量避免操作元数据,但是对于EF框架确实是一个很好的选择。废话一大堆,也不知道表述清楚没!有了此想法,就开始各种博客园,之后终于发现了正道,qouoww写了一篇探索EDM(Entity Framework)的EDM元数据对我启发很深,果断苦海无涯,回头是岸。

下面附上TestModel.edmx文件,及使用读取XML的xmlhelper操作类:如果要验证程序,可以自己建立一个.edmx文件,然后使用xmlhelper类进行处理查看效果。下一次将讲述使用操作元数据的方式处理EF。

TestModel.edmx文件:

  1. 1: <?xml version="1.0" encoding="utf-8"?>
  1. 2: <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  1. 3: <!-- EF Runtime content -->
  1. 4: <edmx:Runtime>
  1. 5: <!-- SSDL content -->
  1. 6: <edmx:StorageModels>
  1. 7: <Schema Namespace="testModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
  1. 8: <EntityContainer Name="testModelStoreContainer">
  1. 9: <EntitySet Name="SB_QXD" EntityType="testModel.Store.SB_QXD" store:Type="Tables" Schema="dbo" />
  1. 10: <EntitySet Name="SB_QXD_BPBJ" EntityType="testModel.Store.SB_QXD_BPBJ" store:Type="Tables" Schema="dbo" />
  1. 11: <EntitySet Name="SB_QXD_SBXX" EntityType="testModel.Store.SB_QXD_SBXX" store:Type="Tables" Schema="dbo" />
  1. 12: <EntitySet Name="SB_QXD_WXXM" EntityType="testModel.Store.SB_QXD_WXXM" store:Type="Tables" Schema="dbo" />
  1. 13: <EntitySet Name="SB_SBGH" EntityType="testModel.Store.SB_SBGH" store:Type="Tables" Schema="dbo" />
  1. 14: <EntitySet Name="SB_SBGH_SBXX" EntityType="testModel.Store.SB_SBGH_SBXX" store:Type="Tables" Schema="dbo" />
  1. 15: <EntitySet Name="SysDepartment" EntityType="testModel.Store.SysDepartment" store:Type="Tables" Schema="dbo" />
  1. 16: <EntitySet Name="SysPerson" EntityType="testModel.Store.SysPerson" store:Type="Tables" Schema="dbo" />
  1. 17: <AssociationSet Name="FK_SB_QXD_B_REFERENCE_SB_QXD" Association="testModel.Store.FK_SB_QXD_B_REFERENCE_SB_QXD">
  1. 18: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 19: <End Role="SB_QXD_BPBJ" EntitySet="SB_QXD_BPBJ" />
  1. 20: </AssociationSet>
  1. 21: <AssociationSet Name="FK_SB_QXD_REFERENCE_SYSDEPAR" Association="testModel.Store.FK_SB_QXD_REFERENCE_SYSDEPAR">
  1. 22: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 23: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 24: </AssociationSet>
  1. 25: <AssociationSet Name="FK_SB_QXD_REFERENCE_SYSPERSO" Association="testModel.Store.FK_SB_QXD_REFERENCE_SYSPERSO">
  1. 26: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 27: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 28: </AssociationSet>
  1. 29: <AssociationSet Name="FK_SB_QXD_S_REFERENCE_SB_QXD" Association="testModel.Store.FK_SB_QXD_S_REFERENCE_SB_QXD">
  1. 30: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 31: <End Role="SB_QXD_SBXX" EntitySet="SB_QXD_SBXX" />
  1. 32: </AssociationSet>
  1. 33: <AssociationSet Name="FK_SB_QXD_W_REFERENCE_SB_QXD" Association="testModel.Store.FK_SB_QXD_W_REFERENCE_SB_QXD">
  1. 34: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 35: <End Role="SB_QXD_WXXM" EntitySet="SB_QXD_WXXM" />
  1. 36: </AssociationSet>
  1. 37: <AssociationSet Name="FK_SB_QXD_W_REFERENCE_SYSPERSO" Association="testModel.Store.FK_SB_QXD_W_REFERENCE_SYSPERSO">
  1. 38: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 39: <End Role="SB_QXD_WXXM" EntitySet="SB_QXD_WXXM" />
  1. 40: </AssociationSet>
  1. 41: <AssociationSet Name="FK_SB_SBGH__REFERENCE_SB_SBGH" Association="testModel.Store.FK_SB_SBGH__REFERENCE_SB_SBGH">
  1. 42: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 43: <End Role="SB_SBGH_SBXX" EntitySet="SB_SBGH_SBXX" />
  1. 44: </AssociationSet>
  1. 45: <AssociationSet Name="FK_SB_SBGH_REFERENCE_SYSDEPAR" Association="testModel.Store.FK_SB_SBGH_REFERENCE_SYSDEPAR">
  1. 46: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 47: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 48: </AssociationSet>
  1. 49: <AssociationSet Name="FK_SB_SBGH_REFERENCE_SYSPERSO" Association="testModel.Store.FK_SB_SBGH_REFERENCE_SYSPERSO">
  1. 50: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 51: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 52: </AssociationSet>
  1. 53: <AssociationSet Name="FK_SYSDEPAR_部门与部门_SYSDEPAR" Association="testModel.Store.FK_SYSDEPAR_部门与部门_SYSDEPAR">
  1. 54: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 55: <End Role="SysDepartment1" EntitySet="SysDepartment" />
  1. 56: </AssociationSet>
  1. 57: <AssociationSet Name="FK_SYSPERSO_部门与人员_SYSDEPAR" Association="testModel.Store.FK_SYSPERSO_部门与人员_SYSDEPAR">
  1. 58: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 59: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 60: </AssociationSet>
  1. 61: </EntityContainer>
  1. 62: <EntityType Name="SB_QXD">
  1. 63: <Key>
  1. 64: <PropertyRef Name="ID" />
  1. 65: </Key>
  1. 66: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 67: <Property Name="QXD_RWRQ" Type="datetime" />
  1. 68: <Property Name="QXD_ZDRQ" Type="datetime" />
  1. 69: <Property Name="QXD_DJBM" Type="nvarchar" MaxLength="50" />
  1. 70: <Property Name="QXD_WXFS" Type="nvarchar" MaxLength="50" />
  1. 71: <Property Name="BM_ID_QXBM" Type="nvarchar" MaxLength="36" />
  1. 72: <Property Name="RY_ID_QXR" Type="nvarchar" MaxLength="36" />
  1. 73: <Property Name="QXD_DJLY" Type="nvarchar" MaxLength="50" />
  1. 74: <Property Name="QXD_BZ" Type="nvarchar" MaxLength="200" />
  1. 75: <Property Name="LYDJ_ID" Type="nvarchar" MaxLength="36" />
  1. 76: </EntityType>
  1. 77: <EntityType Name="SB_QXD_BPBJ">
  1. 78: <Key>
  1. 79: <PropertyRef Name="ID" />
  1. 80: </Key>
  1. 81: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 82: <Property Name="WLKP_ID" Type="nvarchar" MaxLength="36" />
  1. 83: <Property Name="WLKP_GGXH" Type="nvarchar" MaxLength="100" />
  1. 84: <Property Name="BPBJ_YL" Type="real" />
  1. 85: <Property Name="WLKP_JLDW" Type="nvarchar" MaxLength="50" />
  1. 86: <Property Name="BPBJ_BZ" Type="nvarchar" MaxLength="200" />
  1. 87: <Property Name="QXD_ID" Type="nvarchar" MaxLength="36" />
  1. 88: </EntityType>
  1. 89: <EntityType Name="SB_QXD_SBXX">
  1. 90: <Key>
  1. 91: <PropertyRef Name="ID" />
  1. 92: </Key>
  1. 93: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 94: <Property Name="SBKP_BM" Type="nvarchar" MaxLength="36" />
  1. 95: <Property Name="SBKP_MC" Type="nvarchar" MaxLength="50" />
  1. 96: <Property Name="SBKP_GGXH" Type="nvarchar" MaxLength="100" />
  1. 97: <Property Name="SBXX_WXGS" Type="real" />
  1. 98: <Property Name="SBXX_TJGS" Type="real" />
  1. 99: <Property Name="SBXX_SQKSRQ" Type="datetime" />
  1. 100: <Property Name="SBXX_SQJSRQ" Type="datetime" />
  1. 101: <Property Name="SBXX_JHKSRQ" Type="datetime" />
  1. 102: <Property Name="SBXX_JHJSRQ" Type="datetime" />
  1. 103: <Property Name="SBXX_SJKSRQ" Type="datetime" />
  1. 104: <Property Name="SBXX_SJJSRQ" Type="datetime" />
  1. 105: <Property Name="SBXX_WXNR" Type="nvarchar" MaxLength="1000" />
  1. 106: <Property Name="SBXX_JTQX" Type="nvarchar" MaxLength="1000" />
  1. 107: <Property Name="SBXX_QXYY" Type="nvarchar" MaxLength="1000" />
  1. 108: <Property Name="SBXX_BZ" Type="nvarchar" MaxLength="200" />
  1. 109: <Property Name="QXD_DI" Type="nvarchar" MaxLength="36" />
  1. 110: </EntityType>
  1. 111: <EntityType Name="SB_QXD_WXXM">
  1. 112: <Key>
  1. 113: <PropertyRef Name="ID" />
  1. 114: </Key>
  1. 115: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 116: <Property Name="WXXM_ID" Type="nvarchar" MaxLength="36" />
  1. 117: <Property Name="WXXM_MC" Type="nvarchar" MaxLength="50" />
  1. 118: <Property Name="WXXM_YQ" Type="nvarchar" MaxLength="1500" />
  1. 119: <Property Name="WXXM_SM" Type="nvarchar" MaxLength="1500" />
  1. 120: <Property Name="WXXM_MBLX" Type="nvarchar" MaxLength="100" />
  1. 121: <Property Name="WXXM_MBZ" Type="nvarchar" MaxLength="100" />
  1. 122: <Property Name="WXXM_MBSX" Type="nvarchar" MaxLength="100" />
  1. 123: <Property Name="WXXM_MBXX" Type="nvarchar" MaxLength="100" />
  1. 124: <Property Name="RY_ID" Type="nvarchar" MaxLength="36" />
  1. 125: <Property Name="WXXM_BZ" Type="nvarchar" MaxLength="200" />
  1. 126: <Property Name="QXD_ID" Type="nvarchar" MaxLength="36" />
  1. 127: </EntityType>
  1. 128: <EntityType Name="SB_SBGH">
  1. 129: <Key>
  1. 130: <PropertyRef Name="ID" />
  1. 131: </Key>
  1. 132: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 133: <Property Name="SBGH_YWRQ" Type="datetime" />
  1. 134: <Property Name="SBGH_DJRQ" Type="datetime" />
  1. 135: <Property Name="SBGH_DJBH" Type="nvarchar" MaxLength="50" />
  1. 136: <Property Name="SBGH_ZLBZ" Type="nvarchar" MaxLength="36" />
  1. 137: <Property Name="WLDW_ID_ZLDW" Type="nvarchar" MaxLength="50" />
  1. 138: <Property Name="BM_ID_JB" Type="nvarchar" MaxLength="36" />
  1. 139: <Property Name="RY_ID_JB" Type="nvarchar" MaxLength="36" />
  1. 140: <Property Name="SBZL_YJ" Type="real" />
  1. 141: <Property Name="SBZL_DJLY" Type="nvarchar" MaxLength="50" />
  1. 142: <Property Name="SBZL_BZ" Type="nvarchar" MaxLength="200" />
  1. 143: <Property Name="LYDJ_ID" Type="nvarchar" MaxLength="36" />
  1. 144: </EntityType>
  1. 145: <EntityType Name="SB_SBGH_SBXX">
  1. 146: <Key>
  1. 147: <PropertyRef Name="ID" />
  1. 148: </Key>
  1. 149: <Property Name="ID" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 150: <Property Name="SBKP_ID" Type="nvarchar" MaxLength="36" />
  1. 151: <Property Name="SBKP_MC" Type="nvarchar" MaxLength="50" />
  1. 152: <Property Name="SBKP_GGXH" Type="nvarchar" MaxLength="100" />
  1. 153: <Property Name="SBXX_KSRQ" Type="datetime" />
  1. 154: <Property Name="SBXX_JSRQ" Type="datetime" />
  1. 155: <Property Name="SBXX_SL" Type="real" />
  1. 156: <Property Name="SBXX_DJDW" Type="nvarchar" MaxLength="50" />
  1. 157: <Property Name="SBXX_DJ" Type="real" />
  1. 158: <Property Name="SBXX_SFSH" Type="bit" />
  1. 159: <Property Name="SBXX_JE" Type="real" />
  1. 160: <Property Name="SBXX_YJ" Type="real" />
  1. 161: <Property Name="SBXX_FCJH" Type="real" />
  1. 162: <Property Name="SBXX_BZ" Type="nvarchar" MaxLength="200" />
  1. 163: <Property Name="SBZL_ID" Type="nvarchar" MaxLength="36" />
  1. 164: </EntityType>
  1. 165: <EntityType Name="SysDepartment">
  1. 166: <Key>
  1. 167: <PropertyRef Name="Id" />
  1. 168: </Key>
  1. 169: <Property Name="Id" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 170: <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="200" />
  1. 171: <Property Name="ParentId" Type="nvarchar" MaxLength="36" />
  1. 172: <Property Name="Address" Type="nvarchar" MaxLength="200" />
  1. 173: <Property Name="Sort" Type="int" />
  1. 174: <Property Name="Remark" Type="nvarchar" />
  1. 175: <Property Name="CreateTime" Type="datetime" />
  1. 176: <Property Name="CreatePerson" Type="nvarchar" MaxLength="200" />
  1. 177: <Property Name="UpdateTime" Type="datetime" />
  1. 178: <Property Name="UpdatePerson" Type="nvarchar" MaxLength="200" />
  1. 179: </EntityType>
  1. 180: <EntityType Name="SysPerson">
  1. 181: <Key>
  1. 182: <PropertyRef Name="Id" />
  1. 183: </Key>
  1. 184: <Property Name="Id" Type="nvarchar" Nullable="false" MaxLength="36" />
  1. 185: <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="200" />
  1. 186: <Property Name="MyName" Type="nvarchar" MaxLength="200" />
  1. 187: <Property Name="Password" Type="nvarchar" Nullable="false" MaxLength="200" />
  1. 188: <Property Name="SurePassword" Type="nvarchar" MaxLength="200" />
  1. 189: <Property Name="Sex" Type="nvarchar" MaxLength="200" />
  1. 190: <Property Name="SysDepartmentId" Type="nvarchar" MaxLength="36" />
  1. 191: <Property Name="Position" Type="nvarchar" MaxLength="200" />
  1. 192: <Property Name="MobilePhoneNumber" Type="nvarchar" MaxLength="200" />
  1. 193: <Property Name="PhoneNumber" Type="nvarchar" MaxLength="200" />
  1. 194: <Property Name="Province" Type="nvarchar" MaxLength="200" />
  1. 195: <Property Name="City" Type="nvarchar" MaxLength="200" />
  1. 196: <Property Name="Village" Type="nvarchar" MaxLength="200" />
  1. 197: <Property Name="Address" Type="nvarchar" MaxLength="200" />
  1. 198: <Property Name="EmailAddress" Type="nvarchar" MaxLength="200" />
  1. 199: <Property Name="Remark" Type="decimal" />
  1. 200: <Property Name="State" Type="nvarchar" MaxLength="200" />
  1. 201: <Property Name="CreateTime" Type="datetime" />
  1. 202: <Property Name="CreatePerson" Type="nvarchar" MaxLength="200" />
  1. 203: <Property Name="UpdateTime" Type="datetime" />
  1. 204: <Property Name="UpdatePerson" Type="nvarchar" MaxLength="200" />
  1. 205: <Property Name="Version" Type="timestamp" StoreGeneratedPattern="Computed" />
  1. 206: </EntityType>
  1. 207: <Association Name="FK_SB_QXD_B_REFERENCE_SB_QXD">
  1. 208: <End Role="SB_QXD" Type="testModel.Store.SB_QXD" Multiplicity="0..1" />
  1. 209: <End Role="SB_QXD_BPBJ" Type="testModel.Store.SB_QXD_BPBJ" Multiplicity="*" />
  1. 210: <ReferentialConstraint>
  1. 211: <Principal Role="SB_QXD">
  1. 212: <PropertyRef Name="ID" />
  1. 213: </Principal>
  1. 214: <Dependent Role="SB_QXD_BPBJ">
  1. 215: <PropertyRef Name="QXD_ID" />
  1. 216: </Dependent>
  1. 217: </ReferentialConstraint>
  1. 218: </Association>
  1. 219: <Association Name="FK_SB_QXD_REFERENCE_SYSDEPAR">
  1. 220: <End Role="SysDepartment" Type="testModel.Store.SysDepartment" Multiplicity="0..1" />
  1. 221: <End Role="SB_QXD" Type="testModel.Store.SB_QXD" Multiplicity="*" />
  1. 222: <ReferentialConstraint>
  1. 223: <Principal Role="SysDepartment">
  1. 224: <PropertyRef Name="Id" />
  1. 225: </Principal>
  1. 226: <Dependent Role="SB_QXD">
  1. 227: <PropertyRef Name="BM_ID_QXBM" />
  1. 228: </Dependent>
  1. 229: </ReferentialConstraint>
  1. 230: </Association>
  1. 231: <Association Name="FK_SB_QXD_REFERENCE_SYSPERSO">
  1. 232: <End Role="SysPerson" Type="testModel.Store.SysPerson" Multiplicity="0..1" />
  1. 233: <End Role="SB_QXD" Type="testModel.Store.SB_QXD" Multiplicity="*" />
  1. 234: <ReferentialConstraint>
  1. 235: <Principal Role="SysPerson">
  1. 236: <PropertyRef Name="Id" />
  1. 237: </Principal>
  1. 238: <Dependent Role="SB_QXD">
  1. 239: <PropertyRef Name="RY_ID_QXR" />
  1. 240: </Dependent>
  1. 241: </ReferentialConstraint>
  1. 242: </Association>
  1. 243: <Association Name="FK_SB_QXD_S_REFERENCE_SB_QXD">
  1. 244: <End Role="SB_QXD" Type="testModel.Store.SB_QXD" Multiplicity="0..1" />
  1. 245: <End Role="SB_QXD_SBXX" Type="testModel.Store.SB_QXD_SBXX" Multiplicity="*" />
  1. 246: <ReferentialConstraint>
  1. 247: <Principal Role="SB_QXD">
  1. 248: <PropertyRef Name="ID" />
  1. 249: </Principal>
  1. 250: <Dependent Role="SB_QXD_SBXX">
  1. 251: <PropertyRef Name="QXD_DI" />
  1. 252: </Dependent>
  1. 253: </ReferentialConstraint>
  1. 254: </Association>
  1. 255: <Association Name="FK_SB_QXD_W_REFERENCE_SB_QXD">
  1. 256: <End Role="SB_QXD" Type="testModel.Store.SB_QXD" Multiplicity="0..1" />
  1. 257: <End Role="SB_QXD_WXXM" Type="testModel.Store.SB_QXD_WXXM" Multiplicity="*" />
  1. 258: <ReferentialConstraint>
  1. 259: <Principal Role="SB_QXD">
  1. 260: <PropertyRef Name="ID" />
  1. 261: </Principal>
  1. 262: <Dependent Role="SB_QXD_WXXM">
  1. 263: <PropertyRef Name="QXD_ID" />
  1. 264: </Dependent>
  1. 265: </ReferentialConstraint>
  1. 266: </Association>
  1. 267: <Association Name="FK_SB_QXD_W_REFERENCE_SYSPERSO">
  1. 268: <End Role="SysPerson" Type="testModel.Store.SysPerson" Multiplicity="0..1" />
  1. 269: <End Role="SB_QXD_WXXM" Type="testModel.Store.SB_QXD_WXXM" Multiplicity="*" />
  1. 270: <ReferentialConstraint>
  1. 271: <Principal Role="SysPerson">
  1. 272: <PropertyRef Name="Id" />
  1. 273: </Principal>
  1. 274: <Dependent Role="SB_QXD_WXXM">
  1. 275: <PropertyRef Name="RY_ID" />
  1. 276: </Dependent>
  1. 277: </ReferentialConstraint>
  1. 278: </Association>
  1. 279: <Association Name="FK_SB_SBGH__REFERENCE_SB_SBGH">
  1. 280: <End Role="SB_SBGH" Type="testModel.Store.SB_SBGH" Multiplicity="0..1" />
  1. 281: <End Role="SB_SBGH_SBXX" Type="testModel.Store.SB_SBGH_SBXX" Multiplicity="*" />
  1. 282: <ReferentialConstraint>
  1. 283: <Principal Role="SB_SBGH">
  1. 284: <PropertyRef Name="ID" />
  1. 285: </Principal>
  1. 286: <Dependent Role="SB_SBGH_SBXX">
  1. 287: <PropertyRef Name="SBZL_ID" />
  1. 288: </Dependent>
  1. 289: </ReferentialConstraint>
  1. 290: </Association>
  1. 291: <Association Name="FK_SB_SBGH_REFERENCE_SYSDEPAR">
  1. 292: <End Role="SysDepartment" Type="testModel.Store.SysDepartment" Multiplicity="0..1" />
  1. 293: <End Role="SB_SBGH" Type="testModel.Store.SB_SBGH" Multiplicity="*" />
  1. 294: <ReferentialConstraint>
  1. 295: <Principal Role="SysDepartment">
  1. 296: <PropertyRef Name="Id" />
  1. 297: </Principal>
  1. 298: <Dependent Role="SB_SBGH">
  1. 299: <PropertyRef Name="BM_ID_JB" />
  1. 300: </Dependent>
  1. 301: </ReferentialConstraint>
  1. 302: </Association>
  1. 303: <Association Name="FK_SB_SBGH_REFERENCE_SYSPERSO">
  1. 304: <End Role="SysPerson" Type="testModel.Store.SysPerson" Multiplicity="0..1" />
  1. 305: <End Role="SB_SBGH" Type="testModel.Store.SB_SBGH" Multiplicity="*" />
  1. 306: <ReferentialConstraint>
  1. 307: <Principal Role="SysPerson">
  1. 308: <PropertyRef Name="Id" />
  1. 309: </Principal>
  1. 310: <Dependent Role="SB_SBGH">
  1. 311: <PropertyRef Name="RY_ID_JB" />
  1. 312: </Dependent>
  1. 313: </ReferentialConstraint>
  1. 314: </Association>
  1. 315: <Association Name="FK_SYSDEPAR_部门与部门_SYSDEPAR">
  1. 316: <End Role="SysDepartment" Type="testModel.Store.SysDepartment" Multiplicity="0..1" />
  1. 317: <End Role="SysDepartment1" Type="testModel.Store.SysDepartment" Multiplicity="*" />
  1. 318: <ReferentialConstraint>
  1. 319: <Principal Role="SysDepartment">
  1. 320: <PropertyRef Name="Id" />
  1. 321: </Principal>
  1. 322: <Dependent Role="SysDepartment1">
  1. 323: <PropertyRef Name="ParentId" />
  1. 324: </Dependent>
  1. 325: </ReferentialConstraint>
  1. 326: </Association>
  1. 327: <Association Name="FK_SYSPERSO_部门与人员_SYSDEPAR">
  1. 328: <End Role="SysDepartment" Type="testModel.Store.SysDepartment" Multiplicity="0..1" />
  1. 329: <End Role="SysPerson" Type="testModel.Store.SysPerson" Multiplicity="*" />
  1. 330: <ReferentialConstraint>
  1. 331: <Principal Role="SysDepartment">
  1. 332: <PropertyRef Name="Id" />
  1. 333: </Principal>
  1. 334: <Dependent Role="SysPerson">
  1. 335: <PropertyRef Name="SysDepartmentId" />
  1. 336: </Dependent>
  1. 337: </ReferentialConstraint>
  1. 338: </Association>
  1. 339: </Schema></edmx:StorageModels>
  1. 340: <!-- CSDL content -->
  1. 341: <edmx:ConceptualModels>
  1. 342: <Schema Namespace="testModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
  1. 343: <EntityContainer Name="testEntities" annotation:LazyLoadingEnabled="true">
  1. 344: <EntitySet Name="SB_QXD" EntityType="testModel.SB_QXD" />
  1. 345: <EntitySet Name="SB_QXD_BPBJ" EntityType="testModel.SB_QXD_BPBJ" />
  1. 346: <EntitySet Name="SB_QXD_SBXX" EntityType="testModel.SB_QXD_SBXX" />
  1. 347: <EntitySet Name="SB_QXD_WXXM" EntityType="testModel.SB_QXD_WXXM" />
  1. 348: <AssociationSet Name="FK_SB_QXD_B_REFERENCE_SB_QXD" Association="testModel.FK_SB_QXD_B_REFERENCE_SB_QXD">
  1. 349: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 350: <End Role="SB_QXD_BPBJ" EntitySet="SB_QXD_BPBJ" />
  1. 351: </AssociationSet>
  1. 352: <AssociationSet Name="FK_SB_QXD_S_REFERENCE_SB_QXD" Association="testModel.FK_SB_QXD_S_REFERENCE_SB_QXD">
  1. 353: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 354: <End Role="SB_QXD_SBXX" EntitySet="SB_QXD_SBXX" />
  1. 355: </AssociationSet>
  1. 356: <AssociationSet Name="FK_SB_QXD_W_REFERENCE_SB_QXD" Association="testModel.FK_SB_QXD_W_REFERENCE_SB_QXD">
  1. 357: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 358: <End Role="SB_QXD_WXXM" EntitySet="SB_QXD_WXXM" />
  1. 359: </AssociationSet>
  1. 360: <EntitySet Name="SB_SBGH" EntityType="testModel.SB_SBGH" />
  1. 361: <EntitySet Name="SB_SBGH_SBXX" EntityType="testModel.SB_SBGH_SBXX" />
  1. 362: <AssociationSet Name="FK_SB_SBGH__REFERENCE_SB_SBGH" Association="testModel.FK_SB_SBGH__REFERENCE_SB_SBGH">
  1. 363: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 364: <End Role="SB_SBGH_SBXX" EntitySet="SB_SBGH_SBXX" />
  1. 365: </AssociationSet>
  1. 366: <EntitySet Name="SysDepartment" EntityType="testModel.SysDepartment" />
  1. 367: <AssociationSet Name="FK_SB_QXD_REFERENCE_SYSDEPAR" Association="testModel.FK_SB_QXD_REFERENCE_SYSDEPAR">
  1. 368: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 369: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 370: </AssociationSet>
  1. 371: <AssociationSet Name="FK_SB_SBGH_REFERENCE_SYSDEPAR" Association="testModel.FK_SB_SBGH_REFERENCE_SYSDEPAR">
  1. 372: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 373: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 374: </AssociationSet>
  1. 375: <AssociationSet Name="FK_SYSDEPAR_部门与部门_SYSDEPAR" Association="testModel.FK_SYSDEPAR_部门与部门_SYSDEPAR">
  1. 376: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 377: <End Role="SysDepartment1" EntitySet="SysDepartment" />
  1. 378: </AssociationSet>
  1. 379: <EntitySet Name="SysPerson" EntityType="testModel.SysPerson" />
  1. 380: <AssociationSet Name="FK_SB_QXD_REFERENCE_SYSPERSO" Association="testModel.FK_SB_QXD_REFERENCE_SYSPERSO">
  1. 381: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 382: <End Role="SB_QXD" EntitySet="SB_QXD" />
  1. 383: </AssociationSet>
  1. 384: <AssociationSet Name="FK_SB_QXD_W_REFERENCE_SYSPERSO" Association="testModel.FK_SB_QXD_W_REFERENCE_SYSPERSO">
  1. 385: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 386: <End Role="SB_QXD_WXXM" EntitySet="SB_QXD_WXXM" />
  1. 387: </AssociationSet>
  1. 388: <AssociationSet Name="FK_SB_SBGH_REFERENCE_SYSPERSO" Association="testModel.FK_SB_SBGH_REFERENCE_SYSPERSO">
  1. 389: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 390: <End Role="SB_SBGH" EntitySet="SB_SBGH" />
  1. 391: </AssociationSet>
  1. 392: <AssociationSet Name="FK_SYSPERSO_部门与人员_SYSDEPAR" Association="testModel.FK_SYSPERSO_部门与人员_SYSDEPAR">
  1. 393: <End Role="SysDepartment" EntitySet="SysDepartment" />
  1. 394: <End Role="SysPerson" EntitySet="SysPerson" />
  1. 395: </AssociationSet>
  1. 396: </EntityContainer>
  1. 397: <EntityType Name="SB_QXD">
  1. 398: <Key>
  1. 399: <PropertyRef Name="ID" />
  1. 400: </Key>
  1. 401: <Property Name="ID" Type="String" Nullable="false" MaxLength="36" Unicode="true" FixedLength="false" >
  1. 402: <Documentation>
  1. 403: <Summary>主键</Summary>
  1. 404: </Documentation>
  1. 405: </Property>
  1. 406: <Property Name="QXD_RWRQ" Type="DateTime" />
  1. 407: <Property Name="QXD_ZDRQ" Type="DateTime" />
  1. 408: <Property Name="QXD_DJBM" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 409: <Property Name="QXD_WXFS" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 410: <Property Name="BM_ID_QXBM" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 411: <Property Name="RY_ID_QXR" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 412: <Property Name="QXD_DJLY" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 413: <Property Name="QXD_BZ" Type="String" MaxLength="200" Unicode="true" FixedLength="false" />
  1. 414: <Property Name="LYDJ_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 415: <NavigationProperty Name="SB_QXD_BPBJ" Relationship="testModel.FK_SB_QXD_B_REFERENCE_SB_QXD" FromRole="SB_QXD" ToRole="SB_QXD_BPBJ" />
  1. 416: <NavigationProperty Name="SB_QXD_SBXX" Relationship="testModel.FK_SB_QXD_S_REFERENCE_SB_QXD" FromRole="SB_QXD" ToRole="SB_QXD_SBXX" />
  1. 417: <NavigationProperty Name="SB_QXD_WXXM" Relationship="testModel.FK_SB_QXD_W_REFERENCE_SB_QXD" FromRole="SB_QXD" ToRole="SB_QXD_WXXM" />
  1. 418: <NavigationProperty Name="SysDepartment" Relationship="testModel.FK_SB_QXD_REFERENCE_SYSDEPAR" FromRole="SB_QXD" ToRole="SysDepartment" />
  1. 419: <NavigationProperty Name="SysPerson" Relationship="testModel.FK_SB_QXD_REFERENCE_SYSPERSO" FromRole="SB_QXD" ToRole="SysPerson" />
  1. 420: </EntityType>
  1. 421: <EntityType Name="SB_QXD_BPBJ">
  1. 422: <Key>
  1. 423: <PropertyRef Name="ID" />
  1. 424: </Key>
  1. 425: <Property Name="ID" Type="String" Nullable="false" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 426: <Property Name="WLKP_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 427: <Property Name="WLKP_GGXH" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 428: <Property Name="BPBJ_YL" Type="Single" />
  1. 429: <Property Name="WLKP_JLDW" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 430: <Property Name="BPBJ_BZ" Type="String" MaxLength="200" Unicode="true" FixedLength="false" />
  1. 431: <Property Name="QXD_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 432: <NavigationProperty Name="SB_QXD" Relationship="testModel.FK_SB_QXD_B_REFERENCE_SB_QXD" FromRole="SB_QXD_BPBJ" ToRole="SB_QXD" />
  1. 433: </EntityType>
  1. 434: <EntityType Name="SB_QXD_SBXX">
  1. 435: <Key>
  1. 436: <PropertyRef Name="ID" />
  1. 437: </Key>
  1. 438: <Property Name="ID" Type="String" Nullable="false" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 439: <Property Name="SBKP_BM" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 440: <Property Name="SBKP_MC" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 441: <Property Name="SBKP_GGXH" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 442: <Property Name="SBXX_WXGS" Type="Single" />
  1. 443: <Property Name="SBXX_TJGS" Type="Single" />
  1. 444: <Property Name="SBXX_SQKSRQ" Type="DateTime" />
  1. 445: <Property Name="SBXX_SQJSRQ" Type="DateTime" />
  1. 446: <Property Name="SBXX_JHKSRQ" Type="DateTime" />
  1. 447: <Property Name="SBXX_JHJSRQ" Type="DateTime" />
  1. 448: <Property Name="SBXX_SJKSRQ" Type="DateTime" />
  1. 449: <Property Name="SBXX_SJJSRQ" Type="DateTime" />
  1. 450: <Property Name="SBXX_WXNR" Type="String" MaxLength="1000" Unicode="true" FixedLength="false" />
  1. 451: <Property Name="SBXX_JTQX" Type="String" MaxLength="1000" Unicode="true" FixedLength="false" />
  1. 452: <Property Name="SBXX_QXYY" Type="String" MaxLength="1000" Unicode="true" FixedLength="false" />
  1. 453: <Property Name="SBXX_BZ" Type="String" MaxLength="200" Unicode="true" FixedLength="false" />
  1. 454: <Property Name="QXD_DI" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 455: <NavigationProperty Name="SB_QXD" Relationship="testModel.FK_SB_QXD_S_REFERENCE_SB_QXD" FromRole="SB_QXD_SBXX" ToRole="SB_QXD" />
  1. 456: </EntityType>
  1. 457: <EntityType Name="SB_QXD_WXXM">
  1. 458: <Key>
  1. 459: <PropertyRef Name="ID" />
  1. 460: </Key>
  1. 461: <Property Name="ID" Type="String" Nullable="false" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 462: <Property Name="WXXM_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 463: <Property Name="WXXM_MC" Type="String" MaxLength="50" Unicode="true" FixedLength="false" />
  1. 464: <Property Name="WXXM_YQ" Type="String" MaxLength="1500" Unicode="true" FixedLength="false" />
  1. 465: <Property Name="WXXM_SM" Type="String" MaxLength="1500" Unicode="true" FixedLength="false" />
  1. 466: <Property Name="WXXM_MBLX" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 467: <Property Name="WXXM_MBZ" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 468: <Property Name="WXXM_MBSX" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 469: <Property Name="WXXM_MBXX" Type="String" MaxLength="100" Unicode="true" FixedLength="false" />
  1. 470: <Property Name="RY_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 471: <Property Name="WXXM_BZ" Type="String" MaxLength="200" Unicode="true" FixedLength="false" />
  1. 472: <Property Name="QXD_ID" Type="String" MaxLength="36" Unicode="true" FixedLength="false" />
  1. 473: <NavigationProperty Name="SB_QXD" Relationship="testModel.FK_SB_QXD_W_REFERENCE_SB_QXD" FromRole="SB_QXD_WXXM" ToRole="SB_QXD" />
  1. 474: <NavigationProperty Name="SysPerson" Relationship="testModel.FK_SB_QXD_W_REFERENCE_SYSPERSO" FromRole="SB_QXD_WXXM" ToRole="SysPerson" />
  1. 475: </EntityType>
  1. 476: <Association Name="FK_SB_QXD_B_REFERENCE_SB_QXD">
  1. 477: <End Role="SB_QXD" Type="testModel.SB_QXD" Multiplicity="0..1" />
  1. 478: <End Role="SB_QXD_BPBJ" Type="testModel.SB_QXD_BPBJ" Multiplicity="*" />
  1. 479: <ReferentialConstraint>
  1. 480: <Principal Role="SB_QXD">
  1. 481: <PropertyRef Name="ID" />
  1. 482: </Principal>
  1. 483: <Dependent Role="SB_QXD_BPBJ">
  1. 484: <PropertyRef Name="QXD_ID" />
  1. 485: </Dependent>
  1. 486: </ReferentialConstraint>
  1. 487: </Association>
  1. 488: <Association Name="FK_SB_QXD_S_REFERENCE_SB_QXD">
  1. 489: <End Role="SB_QXD" Type="testModel.SB_QXD" Multiplicity="0..1" />
  1. 490: <End Role="SB_QXD_SBXX" Type="testModel.SB_QXD_SBXX" Multiplicity="*" />
  1. 491: <ReferentialConstraint>
  1. 492: <Principal Role="SB_QXD">
  1. 493: <PropertyRef Name="ID" />
  1. 494: </Principal>
  1. 495: <Dependent Role="SB_QXD_SBXX">
  1. 496: <PropertyRef Name="QXD_DI" />
  1. 497: </Dependent>
  1. 498: </ReferentialConstraint>
  1. 499: </Association>
  1. 500: <Association Name="FK_SB_QXD_W_REFERENCE_SB_QXD">
  1. 501: <End Role="SB_QXD" Type="testModel.SB_QXD" Multiplicity="0..1" />
  1. 502: <End Role="SB_QXD_WXXM" Type="testModel.SB_QXD_WXXM" Multiplicity="*" />
  1. 503: <ReferentialConstraint>
  1. 504: <Principal Role="SB_QXD">
  1. 505: <PropertyRef Name="ID" />
  1. 506: </Principal>
  1. 507: <Dependent Role="SB_QXD_WXXM">
  1. 508: <PropertyRef Name="QXD_ID" />
  1. 509: </Dependent>
  1. 510: </ReferentialConstraint>
  1. 511: </Association>
  1. 512: <EntityType Name="SB_SBGH">
  1. 513: <Key>
  1. 514: <PropertyRef Name="ID" />
  1. 515: </Key>
  1. 516: <Property Type="String" Name="ID" Nullable="false" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 517: <Property Type="DateTime" Name="SBGH_YWRQ" />
  1. 518: <Property Type="DateTime" Name="SBGH_DJRQ" />
  1. 519: <Property Type="String" Name="SBGH_DJBH" MaxLength="50" FixedLength="false" Unicode="true" />
  1. 520: <Property Type="String" Name="SBGH_ZLBZ" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 521: <Property Type="String" Name="WLDW_ID_ZLDW" MaxLength="50" FixedLength="false" Unicode="true" />
  1. 522: <Property Type="String" Name="BM_ID_JB" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 523: <Property Type="String" Name="RY_ID_JB" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 524: <Property Type="Single" Name="SBZL_YJ" />
  1. 525: <Property Type="String" Name="SBZL_DJLY" MaxLength="50" FixedLength="false" Unicode="true" />
  1. 526: <Property Type="String" Name="SBZL_BZ" MaxLength="200" FixedLength="false" Unicode="true" />
  1. 527: <Property Type="String" Name="LYDJ_ID" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 528: <NavigationProperty Name="SB_SBGH_SBXX" Relationship="testModel.FK_SB_SBGH__REFERENCE_SB_SBGH" FromRole="SB_SBGH" ToRole="SB_SBGH_SBXX" />
  1. 529: <NavigationProperty Name="SysDepartment" Relationship="testModel.FK_SB_SBGH_REFERENCE_SYSDEPAR" FromRole="SB_SBGH" ToRole="SysDepartment" />
  1. 530: <NavigationProperty Name="SysPerson" Relationship="testModel.FK_SB_SBGH_REFERENCE_SYSPERSO" FromRole="SB_SBGH" ToRole="SysPerson" />
  1. 531: </EntityType>
  1. 532: <EntityType Name="SB_SBGH_SBXX">
  1. 533: <Key>
  1. 534: <PropertyRef Name="ID" />
  1. 535: </Key>
  1. 536: <Property Type="String" Name="ID" Nullable="false" MaxLength="36" FixedLength="false" Unicode="true" />
  1. 537: <Property Type="String" Name="SBKP_ID" MaxLe
jx 标签: XmlHelper
  1. 1: using System;
  1. 2: using System.Collections.Generic;
  1. 3: using System.Linq;
  1. 4: using System.Web;
  1. 5:  
  1. 6: using System.Xml;
  1. 7: using System.Data.Metadata.Edm;
  1. 8:  
  1. 9: namespace MvcApplication3.Models.Helper
  1. 10: {
  1. 11: public class XMLHelper
  1. 12: {
  1. 13: /// <summary>
  1. 14: /// 获取主表从表外键关系
  1. 15: /// </summary>
  1. 16: /// <param name="FK"></param>
  1. 17: /// <returns></returns>
  1. 18: public SortedList<string, string> GetTableRelation(string FK, HttpServerUtilityBase Server)
  1. 19: {
  1. 20: XmlDocument doc = new XmlDocument();
  1. 21: string strr = Server.MapPath("~\\Models\\TestModel.edmx");
  1. 22: doc.Load(strr);
  1. 23: XmlNodeList nodes = doc.GetElementsByTagName("Association");
  1. 24: SortedList<string, string> Relationlist = new SortedList<string, string>();
  1. 25:  
  1. 26: foreach (XmlNode nodevalue in nodes)
  1. 27: {
  1. 28: if (nodevalue.Attributes["Name"].Value == FK && Relationlist.Count.Equals(0))
  1. 29: {
  1. 30:  
  1. 31: string str = nodevalue.FirstChild.Attributes["Multiplicity"].Value;
  1. 32: string str1 = nodevalue.FirstChild.NextSibling.Attributes["Multiplicity"].Value;
  1. 33: string str2 = nodevalue.LastChild.FirstChild.Attributes["Role"].Value;
  1. 34: string str3 = nodevalue.LastChild.FirstChild.FirstChild.Attributes["Name"].Value;
  1. 35: string str4 = nodevalue.LastChild.LastChild.Attributes["Role"].Value;
  1. 36: string str5 = nodevalue.LastChild.LastChild.FirstChild.Attributes["Name"].Value;
  1. 37: Relationlist.Add("MainRelation", str);
  1. 38: Relationlist.Add("SubRelation", str1);
  1. 39: Relationlist.Add("MainTable", str2);
  1. 40: Relationlist.Add("MainPropertyName", str3);
  1. 41: Relationlist.Add("SubTable", str4);
  1. 42: Relationlist.Add("SubPropertyName", str5);
  1. 43: }
  1. 44: }
  1. 45: return Relationlist;
  1. 46: }
  1. 47: /// <summary>
  1. 48: /// 获取数据表的主键
  1. 49: /// </summary>
  1. 50: /// <returns></returns>
  1. 51: public SortedList<string, string> GetTableKEY(HttpServerUtilityBase Server)
  1. 52: {
  1. 53: XmlDocument doc = new XmlDocument();
  1. 54: string strr = Server.MapPath("~\\Models\\TestModel.edmx");
  1. 55: doc.Load(strr);
  1. 56: XmlNodeList nodesAll = doc.GetElementsByTagName("EntityType");
  1. 57: SortedList<string, string> keylist = new SortedList<string, string>();
  1. 58: int count = nodesAll.Count;
  1. 59: foreach (XmlNode nodevalue in nodesAll)
  1. 60: {
  1. 61: count--;
  1. 62: if (count >= nodesAll.Count / 2)
  1. 63: {
  1. 64: keylist.Add(nodevalue.Attributes["Name"].Value, nodevalue.FirstChild.FirstChild.Attributes["Name"].Value);
  1. 65: }
  1. 66: }
  1. 67: return keylist;
  1. 68: }
  1. 69:  
  1. 70:  
  1. 71: /// <summary>
  1. 72: /// 通过表名返回与之相关的表及关系
  1. 73: /// </summary>
  1. 74: /// <param name="Server">服务器</param>
  1. 75: /// <param name="TableName">表名</param>
  1. 76: /// <param name="IsShowRelation">是否查询关系</param>
  1. 77: /// <returns>与主表相关所有表的关系</returns>
  1. 78: public static List<TableRelation> GetTable(HttpServerUtilityBase Server, string TableName, bool IsShowRelation)
  1. 79: {
  1. 80: string xmlpath = Server.MapPath("~\\Models\\TestModel.edmx");
  1. 81: XmlDocument xmlnoe = new XmlDocument();
  1. 82: xmlnoe.Load(xmlpath);
  1. 83: XmlNamespaceManager xmlname = new XmlNamespaceManager(xmlnoe.NameTable);
  1. 84: xmlname.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx");
  1. 85: xmlname.AddNamespace("annotation", "http://schemas.microsoft.com/ado/2009/02/edm/annotation");
  1. 86: xmlname.AddNamespace("public", "http://schemas.microsoft.com/ado/2008/09/edm");//添加Schema节点命名空间
  1. 87: XmlNodeList xmlNodesET = xmlnoe.SelectNodes("//edmx:ConceptualModels/public:Schema/public:EntityType", xmlname);
  1. 88: XmlNodeList xmlNodesAT = xmlnoe.SelectNodes("//edmx:ConceptualModels/public:Schema/public:Association", xmlname);
  1. 89:  
  1. 90: SortedList<string, SortedList<string, string>> list1 = new SortedList<string, SortedList<string, string>>();
  1. 91:  
  1. 92: if (IsShowRelation)
  1. 93: {
  1. 94: //list1.Add(TableName, new SortedList<string, string>());
  1. 95: foreach (XmlNode nodeAT in xmlNodesAT)
  1. 96: {
  1. 97: if (nodeAT.FirstChild.Attributes["Role"].Value.Equals(TableName))
  1. 98: {
  1. 99: SortedList<string, string> list = new SortedList<string, string>();
  1. 100: list.Add("Name", nodeAT.Attributes["Name"].Value);//外键关系名称
  1. 101: list.Add("MainRole", nodeAT.FirstChild.Attributes["Role"].Value);//主表
  1. 102: list.Add("MainMultiplicity", nodeAT.FirstChild.Attributes["Multiplicity"].Value);//映射关系 n..n
  1. 103: list.Add("MainKey", nodeAT.ChildNodes[2].FirstChild.FirstChild.Attributes["Name"].Value);//主键
  1. 104: list.Add("SubRole", nodeAT.FirstChild.NextSibling.Attributes["Role"].Value);//子表
  1. 105: list.Add("SubMultiplicity", nodeAT.FirstChild.NextSibling.Attributes["Multiplicity"].Value);//映射关系
  1. 106: list.Add("SubKey", nodeAT.ChildNodes[2].LastChild.FirstChild.Attributes["Name"].Value);//外键
  1. 107: list1.Add(nodeAT.FirstChild.NextSibling.Attributes["Role"].Value, list);
  1. 108: }
  1. 109: else if (nodeAT.FirstChild.NextSibling.Attributes["Role"].Value.Equals(TableName))
  1. 110: {
  1. 111: SortedList<string, string> list = new SortedList<string, string>();
  1. 112: list.Add("Name", nodeAT.Attributes["Name"].Value);//外键关系名称
  1. 113: list.Add("MainRole", nodeAT.FirstChild.Attributes["Role"].Value);//主表
  1. 114: list.Add("MainMultiplicity", nodeAT.FirstChild.Attributes["Multiplicity"].Value);//映射关系 n..n
  1. 115: list.Add("MainKey", nodeAT.ChildNodes[2].FirstChild.FirstChild.Attributes["Name"].Value);//主键
  1. 116: list.Add("SubRole", nodeAT.FirstChild.NextSibling.Attributes["Role"].Value);//子表
  1. 117: list.Add("SubMultiplicity", nodeAT.FirstChild.NextSibling.Attributes["Multiplicity"].Value);//映射关系
  1. 118: list.Add("SubKey", nodeAT.ChildNodes[2].LastChild.FirstChild.Attributes["Name"].Value);//外键
  1. 119: list1.Add(nodeAT.FirstChild.Attributes["Role"].Value, list);
  1. 120:  
  1. 121: SortedList<string, string> listsub = new SortedList<string, string>();
  1. 122: listsub.Add("Name", nodeAT.Attributes["Name"].Value);//外键关系名称
  1. 123: listsub.Add("MainRole", nodeAT.FirstChild.Attributes["Role"].Value);//主表
  1. 124: listsub.Add("MainMultiplicity", nodeAT.FirstChild.Attributes["Multiplicity"].Value);//映射关系 n..n
  1. 125: listsub.Add("MainKey", nodeAT.ChildNodes[2].FirstChild.FirstChild.Attributes["Name"].Value);//主键
  1. 126: listsub.Add("SubRole", nodeAT.FirstChild.NextSibling.Attributes["Role"].Value);//子表
  1. 127: listsub.Add("SubMultiplicity", nodeAT.FirstChild.NextSibling.Attributes["Multiplicity"].Value);//映射关系
  1. 128: listsub.Add("SubKey", nodeAT.ChildNodes[2].LastChild.FirstChild.Attributes["Name"].Value);//外键
  1. 129: list1.Add(nodeAT.FirstChild.NextSibling.Attributes["Role"].Value, listsub);
  1. 130: }
  1. 131: }
  1. 132:  
  1. 133: if (!list1.ContainsKey(TableName))
  1. 134: {
  1. 135: list1.Add(TableName, new SortedList<string, string>());
  1. 136: }
  1. 137: }
  1. 138: else
  1. 139: {
  1. 140: list1.Add(TableName, new SortedList<string, string>());
  1. 141: }
  1. 142: List<TableRelation> listTableRelation = new List<TableRelation>();
  1. 143:  
  1. 144: foreach (var a in list1)//遍历所有该表的关系
  1. 145: {
  1. 146: foreach (XmlNode nodeET in xmlNodesET)//遍历所有EntityType节点的表
  1. 147: {
  1. 148: TableRelation tr = new TableRelation();
  1. 149: if (nodeET.Attributes["Name"].Value.Equals(a.Key))//EntityType节点名是否与关系结构中的主键名相同
  1. 150: {
  1. 151: XmlNode xmlNodesET2 = xmlnoe.SelectSingleNode("//edmx:ConceptualModels/public:Schema/public:EntityType[@Name='" + a.Key + "']/public:Documentation", xmlname);
  1. 152: XmlNodeList xmlNodesET3 = xmlnoe.SelectNodes("//edmx:ConceptualModels/public:Schema/public:EntityType[@Name='" + a.Key + "']/public:Property", xmlname);
  1. 153: List<Column> listColumn = new List<Column>();
  1. 154: foreach (XmlNode nodeET3 in xmlNodesET3)
  1. 155: {
  1. 156: Column column = new Column();
  1. 157: column.columnname = nodeET3.Attributes["Name"].Value;
  1. 158: column.type = nodeET3.Attributes["Type"].Value;
  1. 159: column.title = nodeET3.FirstChild != null ? nodeET3.FirstChild.FirstChild.InnerText : nodeET3.Attributes["Name"].Value;
  1. 160: column.nullable = nodeET3.Attributes["Nullable"] != null ? nodeET3.Attributes["Nullable"].Value : null;
  1. 161: column.maxlength = nodeET3.Attributes["MaxLength"] != null ? nodeET3.Attributes["MaxLength"].Value : null;
  1. 162: if (a.Value.Count > 0 && nodeET3.Attributes["Name"].Value.Equals(a.Value["SubKey"])
  1. 163: || a.Value.Count > 0 && nodeET3.Attributes["Name"].Value.Equals(a.Value["MainKey"]))
  1. 164: {
  1. 165: column.mainrole = a.Value["MainRole"];
  1. 166: column.mainkey = a.Value["MainKey"];
  1. 167: column.relationname = a.Value["Name"];
  1. 168: if (a.Value["MainMultiplicity"].Equals("*"))
  1. 169: {
  1. 170: column.mainmultiplicity = "ManyToOne";
  1. 171: }
  1. 172: else if (a.Value["MainMultiplicity"].Equals("0..1"))
  1. 173: {
  1. 174: column.mainmultiplicity = "OneToMany";
  1. 175: }
  1. 176:  
  1. 177: column.subrole = a.Value["SubRole"];
  1. 178: column.subkey = a.Value["SubKey"];
  1. 179: if (a.Value["SubMultiplicity"].Equals("*"))
  1. 180: {
  1. 181: column.submultiplicity = "ManyToOne";
  1. 182: }
  1. 183: else if (a.Value["SubMultiplicity"].Equals("0..1"))
  1. 184: {
  1. 185: column.submultiplicity = "OneToMany";
  1. 186: }
  1. 187: }
  1. 188: listColumn.Add(column);
  1. 189: }
  1. 190: tr.tablename = a.Key;
  1. 191: tr.tabletitle = xmlNodesET2 != null ? xmlNodesET2.InnerText : a.Key;
  1. 192: tr.columns = listColumn;
  1. 193: listTableRelation.Add(tr);
  1. 194: }
  1. 195: }
  1. 196: }
  1. 197: return listTableRelation;
  1. 198: }
  1. 199:  
  1. 200:
  1. 201: }
  1. 202: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  1. jx 标签: Column

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  1. 1: using System;
  1. 2: using System.Collections.Generic;
  1. 3: using System.Linq;
  1. 4: using System.Text;
  1. 5: using Newtonsoft.Json;
  1. 6:  
  1. 7: namespace EF_XML_TableRelation
  1. 8: {
  1. 9: /// <summary>
  1. 10: /// 数据表列信息
  1. 11: /// </summary>
  1. 12: public class Column
  1. 13: {
  1. 14: /// <summary>
  1. 15: /// 列名
  1. 16: /// </summary>
  1. 17: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 18: public string columnname { get; set; }
  1. 19: /// <summary>
  1. 20: /// 列备注
  1. 21: /// </summary>
  1. 22: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 23: public string title { get; set; }
  1. 24: /// <summary>
  1. 25: /// 列类型
  1. 26: /// </summary>
  1. 27: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 28: public string type { get; set; }
  1. 29: /// <summary>
  1. 30: /// 是否为空
  1. 31: /// </summary>
  1. 32: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 33: public string nullable { get; set; }
  1. 34: /// <summary>
  1. 35: /// 最大长度
  1. 36: /// </summary>
  1. 37: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 38: public string maxlength { get; set; }
  1. 39: /// <summary>
  1. 40: /// 主表名称
  1. 41: /// </summary>
  1. 42: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 43: public string mainrole { get; set; }
  1. 44: /// <summary>
  1. 45: /// 主表主键
  1. 46: /// </summary>
  1. 47: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 48: public string mainkey { get; set; }
  1. 49: /// <summary>
  1. 50: /// 关系名称
  1. 51: /// </summary>
  1. 52: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 53: public string relationname { get; set; }
  1. 54: /// <summary>
  1. 55: /// 主表关系
  1. 56: /// </summary>
  1. 57: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 58: public string mainmultiplicity { get; set; }
  1. 59: /// <summary>
  1. 60: /// 子表名称
  1. 61: /// </summary>
  1. 62: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 63: public string subrole { get; set; }
  1. 64: /// <summary>
  1. 65: /// 子表外键
  1. 66: /// </summary>
  1. 67: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 68: public string subkey { get; set; }
  1. 69: /// <summary>
  1. 70: /// 子表关系
  1. 71: /// </summary>
  1. 72: [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  1. 73: public string submultiplicity { get; set; }
  1. 74: public Column()
  1. 75: {
  1. 76:  
  1. 77: }
  1. 78:  
  1. 79: public Column(string _name, string _title, string _type,
  1. 80: string _mainRole, string _mainKey, string _relationName,
  1. 81: string _mainMultiplicity, string _subRole, string _subKey,
  1. 82: string _subMultiplicity)
  1. 83: {
  1. 84: columnname = _name;
  1. 85: title = _title;
  1. 86: type = _type;
  1. 87: mainrole = _mainRole;
  1. 88: mainkey = _mainKey;
  1. 89: relationname = _relationName;
  1. 90: mainmultiplicity = _mainMultiplicity;
  1. 91: subrole = _subRole;
  1. 92: subkey = _subKey;
  1. 93: submultiplicity = _subMultiplicity;
  1. 94: }
  1. 95: }
  1. 96: }
jx 标签: TableRelation

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  1. 1: using System;
  1. 2: using System.Collections.Generic;
  1. 3: using System.Linq;
  1. 4: using System.Text;
  1. 5:  
  1. 6: namespace EF_XML_TableRelation.XML
  1. 7: {
  1. 8: /// <summary>
  1. 9: /// 数据表关系
  1. 10: /// </summary>
  1. 11: public class TableRelation
  1. 12: {
  1. 13: public string tablename { get; set; }
  1. 14: public string tabletitle { get; set; }
  1. 15: public List<Column> columns { get; set; }
  1. 16: public TableRelation()
  1. 17: {
  1. 18:  
  1. 19: }
  1. 20: public TableRelation(string _name, string _tabletitle, List<Column> _column)
  1. 21: {
  1. 22: tablename = _name;
  1. 23: tabletitle = _tabletitle;
  1. 24: columns = _column;
  1. 25: }
  1. 26: }
  1. 27: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

ADO.NET实体框架Entity Framework模型-基于XML解析的更多相关文章

  1. ADO.NET实体框架Entity Framework模型-基于元数据解析

           上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸 ...

  2. 实体框架(Entity Framework)快速入门

    实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...

  3. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

  4. 实体框架(Entity Framework)快速入门--实例篇

    在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...

  5. 实体框架Entity Framework 4.1快速入门

    介 绍 在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法.而在4.1的Entity Framework中,支开发者先创建实体业务类,然 ...

  6. 实体框架—Entity Framework

    简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...

  7. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  8. [转] ADO.NET实体框架引发争论

    转自:http://developer.51cto.com/art/200811/76356.htm 2008-11-11 14:00 朱永光译 infoq 我要评论(0) 一个在ADO.NET实体框 ...

  9. ORM框架Entity Framework

    博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...

随机推荐

  1. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  2. python面试题(三)

    1 一行代码实现9*9乘法表 print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y ...

  3. iOS开发之计算器

    本项目基于swift3.0的语法. // // ViewController.swift // 加法计算器 // // Created by 葛杨杨 on 2017/7/25. // Copyrigh ...

  4. node.js应用生成windows service的plugin——winser

    from:http://xiaomijsj.blog.163.com/blog/static/89685520135854036206/ 针对项目中windows server machine 不断重 ...

  5. docker学习笔记2--对镜像/容器的命令操作

    Docker启动一个Centos镜像 我们下载完成一个Centos镜像之后,开始启动 docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停 ...

  6. js判断一个数组是否包含一个指定的值

    今天看了一下  有好几种方法  总结一下 1:array.indexOf   此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1 let arr = ['something', ...

  7. 定制AIX操作系统的shell环境

    操作系统与外部最主要的接口就叫做shell.shell是操作系统最外面的一层.shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果. shel ...

  8. UNIX 系统常用管理命令

    一. 引言 UNIX系统作为一种强大的多用户分时操作系统,在越来越多的场合受到了应用,同时,对UNIX的系统管理的要求也随之越来越多,但目前的书籍对UNIX系统管理命令介绍的并不是很多.本文主要是针对 ...

  9. libstdc和glibc的一些共享库问题

    1./usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决 原因是没有GLIBCXX_3.4.15版本,或是更高的版本输入命令 ...

  10. PHP 获取真实IP地址

    function getClientIp($type = 0) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return ...