一直以来,使用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; } }
具体实现,请各位自己实现咯!!!
逻辑不复杂只需要找到数据实体与表结构的映射关系所在的地方,就能得到我们想要的东西。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?