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),当我们的项目经历了一次周期跨度较长的更新后,当我们发布到生产环境时,首要的任务是将新增的表,字段更新到生产数据库.很多时候,当我们发布更新的时候,已 ...
随机推荐
- 转:java使用Filter过滤器对Response返回值进行修改
练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...
- C#发送QQ邮件
1.首先配置一下发件人的账号密码(密码根据自己所选择的的邮箱填写,此处不做展示) <?xml version="1.0" encoding="utf-8" ...
- EF连接Mysql 表'TableDetails'中的列'IsPrimaryKey'的值为DBNull
无法生成模型,因为存在以下异常:'System.Data.StrongTypingException:表'TableDetails'中的列'IsPrimaryKey'的值为DBNull.---> ...
- cdnbest如何查看节点和站点的流量,负载和连接信息
1. 通过查看top信息,查看该区域下所有节点和有访问量的站点的负载情况 点节点列表==>top图标 2. 查看单台节点的负载和连接信息 点节点列表==>管理 点击下图中三个红框可以查看单 ...
- windows 远程连接“发生身份验证错误 要求的函数不受支持”
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\P ...
- js控制easyui文本框例子及控制html例子
easyui $('#value').textbox('setValue',''); //赋值 $('#value').textbox({required:false});//必填,方框变红 $('# ...
- 725. Split Linked List in Parts把链表分成长度不超过1的若干部分
[抄题]: Given a (singly) linked list with head node root, write a function to split the linked list in ...
- swift 需求: 导航栏和HeaderView 使用一个背景图片。
问题界面 需求: 导航栏和HeaderView 使用一个背景图片.解决方案: 让 导航栏 变成透明. override func viewWillAppear(_ animated: Bool) { ...
- [leetcode]716. Max Stack 最大栈
Design a max stack that supports push, pop, top, peekMax and popMax. push(x) -- Push element x onto ...
- java_18 Collection接口
1.Collection接口 Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素 ...