基于Ado.net Entity Framework 通过系统运行时动态编译实现数据表字段的增删
2012-07-17 14:23
651 查看
在很多MIS系统开发过程,经常有客户提出,在系统部署完成后,希望能自己对某一个表进行字段的增删。这个需求有多种解决方案,例如在表中预留50个字段给客户用、建立专门的扩展表给客户用等等。笔者感觉较为完美(也相对复杂)的做法是通过修改数据表结构,然后通过动态编译机制修改实体类,最后通过反射来实现实体类新增属性的调用。由于Ado.net Entity Framework 的普及使用,因此笔者想在EF框架下独立实现这种机制。网上相关的资料较少,以下思路和机制为本人原创。
一、技术原理说明
本系统开发目的,允许用户在系统运行时(而非编译时)对数据库的某一张表字段进行增加或删除,同时保留表中的原有数据、保留原有ADO.Net Entity Framework相关文件(并自动做适当修改),而不需要开发者重新编译并发布程序。
具体的实现思路如下:
1、 创建原始数据表,并填入相关数据,然后创建一个单独的、未来用于重编译的类库(如DataAccess.DynamicCompile),通过ADO.Net Entity
Framework生成相应的.edmx文件和.cs文件。
2、 对这个类库进行编译,在obj\debug\
edmxResourcesToEmbed目录下,可以看到ADO EF的edmx文件已被分解成三个XML文件,分别为csdl(模型层描述)、ssdl(数据库层描述)、msl(映射层描述);obj\tempPE目录下还有一个dll文件,它是用ADO EF的.cs文件编译而成。本次动态编译的内容就包括三个XML文件和一个.cs文件,其中.cs是直接动态编译,XML文件是动态编译时的嵌入资源。所以,在这个类库编译结束后,要从obj目录复制三个XML文件及源码目录的.cs复制出来(例如复制到WEB工程中)以备动态编译时调用。
3、 当用户发起新增或删除列的请求时,本系统会先调用DataDefinitionManager用于修改数据库的表结构,然后使用EFManager修改.cs文件、三个XML文件,最后再进行重新动态编译。编译完成后,asp.net会自动监控bin目录下的文件变化,当DataAccess.DynamicCompile.dll被更新后,将自动重新载入。
4、 DataAccess.DynamicCompile.dll重编译后,内存中将保存新的类型。因此,EntityDataSource将自动更新Gridview中的数据,显示新的列。如果需要用程序访问某一条记录的某一个值,需要使用反射机制(程序中有样例)来实现。
Studio 2010 SP1,.Net Framework 4.0,
数据库为Sql Server 2008。本系统使用的是VS2010自带的Sql Server 2008 Express版。
2、创建数据库:可使用样例数据库,创建表结构的SQL在DataAccess目录下的create.sql文件中,创建完成后可任意添加一些数据进去。
3、如果有对数据库地址、用户名、或表结构做了修改,则需要在DataAccess.DynamicCompile工程中重新生成一下EF,并编译。复制三个XML文件及TestDb.Designer.cs文件到WEB工程的DynamicCompile目录下。如果没有做改变则不需要做此步。
4、运行TestWeb网站,点击“增加列”,等几秒钟,GridView中就动态新增了一列,同时WEB工程的DynamicCompile目录下的文件也会做相应的修改,DataAccess.DynamicCompile .dll也会被更新。点击“删除列”,列名文本框中对应的列将被删除。
2、 建议只允许用户删除新增的字段,不允许用户删除原有字段。
3、 由于每次启动调试时,DataAccess.DynamicCompile
.dll会被系统自动重新编译,所以第一次GridView中显示的列还是默认列,动态编译后再刷新就会按三个XML文件中的内容显示列。正式部署后不会有这个问题。
4、 用户对表结构进行修改后,如果系统又重新部署。建议使用VS2010重新编译ADO EF结构数据,以固化系统结构。
5、 DataAccess.DynamicCompile工程中,从数据库重新生成模型后,会生成一个app.config文件。本文件的内容只有连接字符串,已被TestWeb工程中的Web.config取代,可以删除。
由于一些原因,源码暂时不能公开。以上思路仅供参考。
一、技术原理说明
本系统开发目的,允许用户在系统运行时(而非编译时)对数据库的某一张表字段进行增加或删除,同时保留表中的原有数据、保留原有ADO.Net Entity Framework相关文件(并自动做适当修改),而不需要开发者重新编译并发布程序。
具体的实现思路如下:
1、 创建原始数据表,并填入相关数据,然后创建一个单独的、未来用于重编译的类库(如DataAccess.DynamicCompile),通过ADO.Net Entity
Framework生成相应的.edmx文件和.cs文件。
2、 对这个类库进行编译,在obj\debug\
edmxResourcesToEmbed目录下,可以看到ADO EF的edmx文件已被分解成三个XML文件,分别为csdl(模型层描述)、ssdl(数据库层描述)、msl(映射层描述);obj\tempPE目录下还有一个dll文件,它是用ADO EF的.cs文件编译而成。本次动态编译的内容就包括三个XML文件和一个.cs文件,其中.cs是直接动态编译,XML文件是动态编译时的嵌入资源。所以,在这个类库编译结束后,要从obj目录复制三个XML文件及源码目录的.cs复制出来(例如复制到WEB工程中)以备动态编译时调用。
3、 当用户发起新增或删除列的请求时,本系统会先调用DataDefinitionManager用于修改数据库的表结构,然后使用EFManager修改.cs文件、三个XML文件,最后再进行重新动态编译。编译完成后,asp.net会自动监控bin目录下的文件变化,当DataAccess.DynamicCompile.dll被更新后,将自动重新载入。
4、 DataAccess.DynamicCompile.dll重编译后,内存中将保存新的类型。因此,EntityDataSource将自动更新Gridview中的数据,显示新的列。如果需要用程序访问某一条记录的某一个值,需要使用反射机制(程序中有样例)来实现。
二、环境搭建
1、基础开发环境为:VisualStudio 2010 SP1,.Net Framework 4.0,
数据库为Sql Server 2008。本系统使用的是VS2010自带的Sql Server 2008 Express版。
2、创建数据库:可使用样例数据库,创建表结构的SQL在DataAccess目录下的create.sql文件中,创建完成后可任意添加一些数据进去。
3、如果有对数据库地址、用户名、或表结构做了修改,则需要在DataAccess.DynamicCompile工程中重新生成一下EF,并编译。复制三个XML文件及TestDb.Designer.cs文件到WEB工程的DynamicCompile目录下。如果没有做改变则不需要做此步。
4、运行TestWeb网站,点击“增加列”,等几秒钟,GridView中就动态新增了一列,同时WEB工程的DynamicCompile目录下的文件也会做相应的修改,DataAccess.DynamicCompile .dll也会被更新。点击“删除列”,列名文本框中对应的列将被删除。
三、补充说明
1、 本程序实现了整数型、字符型、日期时间型、浮点小数型、长文字的类型添加,附件建议使用文件方式保存在服务器上,并使用文本型在数据库上保存链接;2、 建议只允许用户删除新增的字段,不允许用户删除原有字段。
3、 由于每次启动调试时,DataAccess.DynamicCompile
.dll会被系统自动重新编译,所以第一次GridView中显示的列还是默认列,动态编译后再刷新就会按三个XML文件中的内容显示列。正式部署后不会有这个问题。
4、 用户对表结构进行修改后,如果系统又重新部署。建议使用VS2010重新编译ADO EF结构数据,以固化系统结构。
5、 DataAccess.DynamicCompile工程中,从数据库重新生成模型后,会生成一个app.config文件。本文件的内容只有连接字符串,已被TestWeb工程中的Web.config取代,可以删除。
由于一些原因,源码暂时不能公开。以上思路仅供参考。
相关文章推荐
- Asp.Net Ajax+WCF Service+ADO.NET Entity Framework实现数据列表,数据筛选,分页,排序,删除
- 用代码说废话之--实现ADO.NET Entity Framework 的数据分页
- Asp.Net Ajax+WCF Service+ADO.NET Entity Framework实现数据列表,数据筛选,分页,排序,删除
- .NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(1)
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #4 -- 数据新增、删除、修改(ObkectContext的 .SaveChange()方法)
- 两个Repeater嵌套实现动态菜单(ado.net+sql和xml+Linq两种读取数据方式)
- 在使用 ADO.NET Entity Framework 时生成的实体类个数少于数据表个数的几种情况及原因分析
- ADO.NET Entity Framework插入和更新数据(实体框架快速入门)
- ADO.NET Entity Framework 使用实体数据模型工具
- ADO.NET Entity Framework 如何:通过每个层次结构一个表继承以定义模型(实体框架)
- ADO.NET Entity Framework使用实体数据
- ADO.NET Entity Framework 如何:通过每种类型多个实体集定义模型(实体框架)
- Silverlight中,使用ADO.NET Entity,WCF RIA,动态加载指定数据库的实现。
- ASP.NET实现增删改查等功能(Access版)系统之二-GridView绑定数据.
- ASP.NET实现增删改查等功能(Access版)系统之六-导出数据到EXCEL
- ADO.Net Entity Framework: 动态修改连接串信息
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架 - 5.1 数据字典管理模块
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架-5.2 表字段综合管理模块
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现