您的位置:首页 > 其它

基于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中的数据,显示新的列。如果需要用程序访问某一条记录的某一个值,需要使用反射机制(程序中有样例)来实现。



二、环境搭建

1、基础开发环境为:Visual
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也会被更新。点击“删除列”,列名文本框中对应的列将被删除。



三、补充说明

1、 本程序实现了整数型、字符型、日期时间型、浮点小数型、长文字的类型添加,附件建议使用文件方式保存在服务器上,并使用文本型在数据库上保存链接;

2、 建议只允许用户删除新增的字段,不允许用户删除原有字段。

3、 由于每次启动调试时,DataAccess.DynamicCompile
.dll会被系统自动重新编译,所以第一次GridView中显示的列还是默认列,动态编译后再刷新就会按三个XML文件中的内容显示列。正式部署后不会有这个问题。

4、 用户对表结构进行修改后,如果系统又重新部署。建议使用VS2010重新编译ADO EF结构数据,以固化系统结构。

5、 DataAccess.DynamicCompile工程中,从数据库重新生成模型后,会生成一个app.config文件。本文件的内容只有连接字符串,已被TestWeb工程中的Web.config取代,可以删除。

由于一些原因,源码暂时不能公开。以上思路仅供参考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐