随笔 - 22, 文章 - 0, 评论 - 97, 阅读 - 58813
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

EF db first 获取表名称

Posted on   冲杀  阅读(785)  评论(0编辑  收藏  举报

一直以来,使用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; } }
复制代码

具体实现,请各位自己实现咯!!!

逻辑不复杂只需要找到数据实体与表结构的映射关系所在的地方,就能得到我们想要的东西。

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示