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;
}
}
具体实现,请各位自己实现咯!!!
逻辑不复杂只需要找到数据实体与表结构的映射关系所在的地方,就能得到我们想要的东西。
EF db first 获取表名称的更多相关文章
- sql数据库获取表名称和表列名
select * from sysobjects where xtype='u' SELECT COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.column ...
- jdbc连接获取表名称
1,Class.forName可以替换为mysql之类其他的数据库驱动 public Connection connect(String url,String username,String pw, ...
- HIVE获取表的大小和修改日期
### 获取表的大小 hdfs dfs -du /user/hive/warehouse/database_name.db/ > 360_du ### 获取表的修改日期 hdfs dfs -ls ...
- pymysql 单独获取表的栏位名称
有时需要获取表的栏位+数值,请参考 https://www.cnblogs.com/xibuhaohao/p/9996571.html 有时只需要栏位名称,那么可以使用 col=self.cursor ...
- PostgreSQL数据库中获取表主键名称
PostgreSQL数据库中获取表主键名称 一.如下表示,要获取teacher表的主键信息: select pg_constraint.conname as pk_name,pg_attribute. ...
- [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)
自己写代码生成器之生成Dal层代码(获取数据库所有表名称) --得到数据库birthday所有表名称 select name from sysobjects where [type]='U' --se ...
- Sql中获取表结构(字段名称,类型,长度,说明)
Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...
- 项目中 2个或者多个EF模型 表名称相同会导致生成的实体类 覆盖的解决方法
场景: 2个数据库, 一个新,一个旧, 把旧的 数据库中的数据,导入到新的数据库中, 使用到了2个 EF实体模型, 新数据库 和 旧数据库中的表,有的名称是相同的 (但是结构是不同的) 旧的数据 ...
- SQlServer 数据库表名称,字段比较
项目中一般分测试环境(QAS),生产环境(PRD),当我们的项目经历了一次周期跨度较长的更新后,当我们发布到生产环境时,首要的任务是将新增的表,字段更新到生产数据库.很多时候,当我们发布更新的时候,已 ...
随机推荐
- Redis-Sentinel 数据源配置
1.redis配置文件 : redis.properties # Redis settings #sentinel_node_1 redis.sentinel1.host=192.168.0.1 re ...
- Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
今天在测试项目代码时,在idea中配置tomcat7插件运行后一直报如下错误: 解决方案:看了网上大多数办法都是修改xml文件配置,感觉并不适用,最后看到比较靠谱解释如下: pom.xml中jar包发 ...
- maven的tomcat插件问题
在dependence中不用加tomcat的jar, 记得在plugin中加入tomcat插件就行. 否则会出问题.
- CentOS开机自动运行自己的脚本详解
一.root权限编辑/etc/rc.d/rc.local su cd /etc/rc.d/ vi rc.local 二.在这个文件加上你要执行的脚本,全部内容如下: #!/bin/sh # # Thi ...
- Springboot 热部署问题。亲测可用。
本人开发使用的是Mac系统,windows应该类似.主要是 spring-boot-devtools的使用 参考:mac下的idea设置,是不是有疑问,既然别人写好了,为啥你还要再来一次,因为我使用了 ...
- 550 5.7.1 Client does not have permissions to send as this sender
收发邮件时出现以上这种情况,系统提示550 5.7.1 Client does not have permissions to send as this sender,这是什么原因赞成的呢? 活动目录 ...
- MFC---关于string.h相关函数
1.在VS2005中使用strcpy.strcat.sprintf出现如:mfc中'strcpy' was declared deprecated警告 这是因为VS2005中认为CRT中的一组函数如果 ...
- Selenium Java关闭浏览器
在学习selenium的过程中发现一个问题,各种博客/教程都是教人用selenium的quit()和close()方法关闭浏览器. 但这不是我要的结果.这两个方法的前提是,用webdriver打开浏览 ...
- python 常用模块(一): os模块,序列化模块(json模块 pickle模块 )
1.os模块 2.序列化模块:(1)json模块 和 pickle模块 一.os模块 os.path.abspath: (1)把路径中不符合规范的/改成操作系统默认的格式 import os path ...
- django 模板使用
1 配置 在工程中创建模板目录templates. 在settings.py配置文件中修改TEMPLATES配置项的DIRS值: TEMPLATES = [ { 'BACKEND': 'django. ...