博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

EF db first 获取表名称

Posted on 2017-06-23 11:00  冲杀  阅读(777)  评论(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; } }

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

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