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),当我们的项目经历了一次周期跨度较长的更新后,当我们发布到生产环境时,首要的任务是将新增的表,字段更新到生产数据库.很多时候,当我们发布更新的时候,已 ...
随机推荐
- How can I manage the modules for python2 when python3 installed as well. In OSX
ref: https://stackoverflow.com/questions/53385448/how-can-i-manage-the-modules-for-python2-when-pyth ...
- docker命令相关
进入容器 容器已经启动 docker exec -it ece7b58a2a04 /bin/sh 容器未启动 docker run -it zzzzz/edas:v1 sh 检查容器 docker i ...
- kettle实现多表同步
本样例实现源库的所有表到目标库的同步sqlserver=>mysql(目标表存在表结构则同步),总调度如下: 由于复制记录到结果保存了多个表名,存在多个值,在高级选择对每个输入行执行一次进行循环 ...
- nginx 301跳转
server { server_name xxxx.com; return 301 $scheme://www.xxxx.com$request_uri; }
- JavaScript倒计时实现
/** * 倒计时函数 * @param {String}} endTime 终止时间戳 */ const countDown = (endTime, callback) => { const ...
- sql查询语句for xml path语法
[原地址] for xml path作用:将多行的查询结果,根据某一些条件合并到一行. 例:现有一张表 执行下面语句 select Department, (SELECT Employee+',' F ...
- MySQL中Checkpoint技术
个人读书笔记,详情参考<MySQL技术内幕 Innodb存储引擎> 1,checkpoint产生的背景数据库在发生增删查改操作的时候,都是先在buffer pool中完成的,为了提高事物操 ...
- (转)Word插入图片显示不全怎么办
https://jingyan.baidu.com/article/e73e26c0c0081c24adb6a73d.html 现在告诉大家解决办法. 方法一: A.单击选中图片,然后在“开始”选项卡 ...
- 吴裕雄 python深度学习与实践(15)
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = ...
- 大端&小端问题