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

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

    试图了解     量子力学 近现代基础物理学理论 量子计算机   脑科学 近现代生物学 遗传变异与进化   复杂工程学 系统工程 管理科学   人工智能 智能算法 机器学习 深度学习 大数据 云计算 ...

  2. Ubuntu 16.04特性及使用基本方法

    十招让Ubuntu 16.04用起来更得心应手 Ubuntu 16.04 LTS的这十项新功能,每个Ubuntu用户必须要知道! Ubuntu 16.04 LTS安装好需要设置的15件事

  3. MySQL 的约束

    约束是添加在列上, 用来约束列的! 1. 主键约束(表中的某行的唯一标识) 主键的特点: 非空 唯一 被引用 创建表时, 指定主键的两种方式: // 需求: 指定 sid 列为主键列, 即为 sid ...

  4. poj 1012 &amp; hdu 1443 Joseph(约瑟夫环变形)

    题目链接: POJ  1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...

  5. C/C++ 关键字的使用方法详解

    cppreference.com -> C/C++ 关键字 -> 细节 C/C++ 关键字 asm 语法: asm( "instruction" ); asm允许你在你 ...

  6. bolg项目

    写代码要尽可能的捕获异常 模板的路径可以直接放到TEMPLATES里面的DIRS当中,TEMPLATE_DIRS可以取消掉 设置static静态文件STATICFILES_DIRS里面,这是一个元组 ...

  7. 【转】SVN使用教程总结

    看到一篇超赞的文章,原链接:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成 ...

  8. Kattis - convexpolygonarea 【数学】

    题意 给出一系列点,求这个多边形面积 思路 向量叉积 AC代码 #include <cstdio> #include <cstring> #include <ctype. ...

  9. Capslock and Esc

    将Caps Lock转换成Esc(windows and linux) 1. linux 下将Caps Lock 转换成Esc 作为一个vimer,Caps Lock对我(还有其他很多人)来说根本就是 ...

  10. fastReport 绑定DataBand数据源后还是打印出一条数据

    升级了fastreport到v2018后,打印出现问题,datasource是多条数据,可打印出来始终只显示第一条 DataBand dataBand = report.FindObject(&quo ...