一直以来,使用DB FIRST的方式,想得到表名,最后一直不得其法。直到昨天晚上,反编译自己的程序集的时候,突然发现EF表结构和数据实体类的映射关系存在什么地方。然后就有了这篇文章。
咱们一步步来。
1. 先使用EF新建一个实体集。在这个过程中请记住下图中的模型命名空间名称,后面有用。
2. 使用XML方式打开edmx文件。然后我们找到节点
<edmx:Mappings> <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs"> <EntityContainerMapping StorageEntityContainer="ReportServerModelStoreContainer" CdmEntityContainer="ReportServerEntities"> <EntitySetMapping Name="Batches"> <EntityTypeMapping TypeName="ReportServerModel.Batch"> <MappingFragment StoreEntitySet="Batch"> <ScalarProperty Name="BatchID" ColumnName="BatchID" /> <ScalarProperty Name="AddedOn" ColumnName="AddedOn" /> <ScalarProperty Name="Action" ColumnName="Action" /> <ScalarProperty Name="Item" ColumnName="Item" /> <ScalarProperty Name="Parent" ColumnName="Parent" /> <ScalarProperty Name="Param" ColumnName="Param" /> <ScalarProperty Name="BoolParam" ColumnName="BoolParam" /> <ScalarProperty Name="Content" ColumnName="Content" /> <ScalarProperty Name="Properties" ColumnName="Properties" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping> </edmx:Mappings>
其中数据实体类名称是在<EntityTypeMapping TypeName="ReportServerModel.Batch">的type name上。规则是 模型命名空间+实体类名字。
数据表名是在MappingFragment StoreEntitySet="Batch" 的StoreEntitySet上。
到了这一步,我们在编译后又该到什么地方寻找这个映射关系文件呢??请看后面
3. 编译后,使用ILspy打开程序集,如下图
这个资源文件中的内容和我们第二步看到是不是一模一样呀。哈哈,到了这一步,我们已经找到了EF DB FIRST 映射关系在编译后存在地方。剩下的就是我们写代码来获取这些。剩下的就不说了
直接上代码
XmlDocument xmlDoc = new XmlDocument(); //这是从资源文件中读取数据的 var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test.msl"); xmlDoc.Load(stream); stream.Close(); stream.Dispose(); foreach (XmlNode node in xmlDoc.DocumentElement.FirstChild.ChildNodes) { //EntitySetMapping if (node.NodeType != XmlNodeType.Element) continue; //类名节点 foreach (XmlNode typeMapping in node.ChildNodes) { //EntityTypeMapping if (typeMapping.NodeType != XmlNodeType.Element) continue; //取表名节点 string tableName = ""; foreach (XmlNode mappingFragment in typeMapping.ChildNodes) { if (mappingFragment.NodeType != XmlNodeType.Element) continue; tableName = (mappingFragment as XmlElement).GetAttribute("StoreEntitySet"); break; } //类名 string typeName = (typeMapping as XmlElement).GetAttribute("TypeName"); TableNames[typeName] = tableName; break; } }
具体实现,请各位自己实现咯!!!
逻辑不复杂只需要找到数据实体与表结构的映射关系所在的地方,就能得到我们想要的东西。
时间: 2024-11-03 20:44:32