EF db first 获取表名称

一直以来,使用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

EF db first 获取表名称的相关文章

项目中 2个或者多个EF模型 表名称相同会导致生成的实体类 覆盖的解决方法

场景:  2个数据库, 一个新,一个旧,  把旧的 数据库中的数据,导入到新的数据库中,  使用到了2个 EF实体模型, 新数据库 和 旧数据库中的表,有的名称是相同的 (但是结构是不同的) 旧的数据库中的 tb_area 表,只有2个字段 新数据库中的 tb_area 有很多字段  ,结果新数据库里面的 表,由于和旧数据库的表 重名,导致旧数据库里面的  表生产的cs文件 没有了, 只剩下新数据库中的表实体   那么现在问题就来了,我要调用旧表里面的 model 实体模型,怎么拿呢? 拿不到了

PostgreSQL数据库中获取表主键名称

PostgreSQL数据库中获取表主键名称 一.如下表示,要获取teacher表的主键信息: select pg_constraint.conname as pk_name,pg_attribute.attname as colname,pg_type.typname as typename from pg_constraint inner join pg_class on pg_constraint.conrelid = pg_class.oid inner join pg_attribute

【t4必须】DbHelper.ttinclude 【t4连接数据库获取表必须】

<#+//连接数据库配置public class config{ public static readonly string [email protected]"server=.;pwd=123;uid=sa;database=oademo;";public static readonly string DbDatabase="oademo";} public class DbHelper{ #region GetDbTables//获取数据库所有的表publ

django配置连接多个数据库,自定义表名称

在项目tt下新建两个app,分别为app01.app02.配置app01使用default节点数据库:app02使用hvdb节点数据库(也可以配置app01下的model既使用default,也可以使用hvdb数据库) 1.编辑settings.py,添加多个数据库: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'testly', 'USER': 'root', 'PASSWORD': '123

struts2入门之struts2获取表单数据

在上一篇博文中分享了action如何获取表单数据,在本篇博文中分享一下用struts2这个框架如何来获取表单数据. struts2获取表单数据可以分为三种方式: 1.属性封装 2.模型驱动封装 3.表达式封装 分别介绍以上三种方式: 属性封装的步骤:首先在action中定义成员变量,并写set方法(这里为了避免和后面的混淆,把get和set方法都写上得了),然后该action要访问的form表单中的属性值要和定义的成员变量名称一样,在action访问到jsp页面时,form表单中的数据都已经拿到

Bash Shell 解析路径获取文件名称和文件夹名

前言 还是今天再写一个自己主动化打包脚本.用到了从路径名中获取最后的文件名称.这里记录一下实现过程. 当然,最后我也会给出官方的做法.(ps:非常囧,实现完了才发现原来Bash Shell有现成的函数) 获取文件名称 如果给定的路径名为: /tmp/csdn/zhengyi/test/zhengyi.txt awk解法 用"/"做分隔符,然后打印出最后的那一部分. 实现代码例如以下: resFile=`echo /tmp/csdn/zhengyi/test/adb.log | awk

Windows Phone 8 获取设备名称

通过使用Microsoft.Phone.Info.DeviceStatus类,我们可以获取设备的一些信息,如设备厂商,设备名称等.通过Microsoft.Phone.Info.DeviceStatus.DeviceName可以获取设备的名称,但是这个名称通常并不是我们熟悉的设备名称,而是该设备标识名称.例如:Lumia520,通过上述接口获取的设备标识是“RM-914_apac_prc_227”,大家对“Lumia520"是比较熟悉,而对于通过接口直接获取的“RM-914_apac_prc_22

汇编-获取函数名称

printstring macro Var: REQ local info .code if DBGWIN_DEBUG_ON eq 1 pushad invoke szLen, addr Var if DBGWIN_EXT_INFO eq 1 info textequ @CatStr(< !(>, SFileName(), <!, >, %@Line, <!)>) ;push eax add eax, @SizeStr(&Var)+4[email protect

SQLSERVER和ORACLE系统表获取表名 列名以及列的注释

在工作中从数据库取的数据要导出来,但是发现导出的EXCEL中列名都是字段名(英文),为此搜集资料怎么把字段名变为中文名称,而发现ORACLE和SQLSERVER(用的SQLSERVER2008R2)又有所不同,具体如下: SQLSERVER数据库: 系统表: ---获取表的相关信息              select * from SYS.OBJECTS  (说明:name:表名 object_id:表的ID)  ---获取列的相关信息 select * from SYS.COLUMNS (