关于.net下的ORM框架,大家最为耳熟的可能就是NHibernate了,当然,很多公司正在使用自己开发的ORM框架,笔者至少见过3家不同公司的ORM框架,其实都是大同小异,借助于codesmith、mygeneration等代码生成工具,自己开发一个ORM框架也不是什么难事,关键的问题是,你能不能设计出代码优美简洁、功能灵活、定制方便以及部署容易的ORM框架。
为什么没有一种部署容易、代码优美、功能不强但是可以灵活定制、封装的恰到好处、轻量级的ORM呢?这个问题一直残绕在我心中,直到我使用了my generation(以下简称为mg,为什么我会尝试使用mg呢,是因为它开源而且免费,而且更容易上手)自带的doodads,当时觉得这个名字很奇怪晦涩,因此想当然地认为这套框架肯定和它的名字一样令人费解,不过抱着试试看的态度我深入了解了doodads,发现它的代码真的是很简单,很优美,貌似功能也不错,且看如下的代码:
// 获取并修改某条记录
Employees emps = new Employees();
if(emps.LoadByPrimaryKey(42))
{
emps.LastName = "Just Got Married";
emps.Save();
}
// 插入新纪录
Employees emps = new Employees();
emps.AddNew();
emps.FirstName = "Mr.";
emps.LastName = "dOOdad";
emps.Sav
e();
dads的新特点,所有的CRUD操作都是通过存储过程实现的,如果您喜欢在数据库中做更多的事情,这是一个让您喜欢doodads的理由
生成CRUD存储过程,现在打开mg中的如下模板:
运行后会为您选中的所有表分别生成CRUD(create、read、update、delete)存储过程,包括:
' 1) proc[表名]LoadByPrimaryKey (如果至少有一个主键)
' 2) proc[表名]LoadAll(加载符合条件的所有记录)
' 3) proc[表名]Update
' 4) proc[表名]Insert
' 5) proc[表名]Delete
注意:现在生成的是sql文件,而不再是cs代码,请把生成的sql文件在数据库中执行生成相应的procedure
现在再运行本项目,不会再提示找不到存储过程了吧!
总结:个人认为doodads的特点有以下几点:
基于存储过程,性能更卓越,灵活性更强
部署非常简单,引用dll生成dal类即可,不像nhibernate那么多配置;简单的基于doodads的项目仅仅需要几个business entity即可
封装的比较浅,您可以很清晰地得知doodads在干什么
提供的接口优美简洁
// 插入新纪录后获得新纪录的主键
int i = emps.EmployeeID;
这是多么简洁易读的、令人亲切的代码!
接下来我将重点介绍doodads的基础知识,按照官方的说法,doodads支持如下的数据库系统:Microsoft SQL, Oracle, Firebird, Access, PostgreSQL, VistaDB, SQLite, and MySQL ,我在oracle 10g以及sql server 2000上有过成功的应用,但是在sql 2005下使用mg生成出来的代码编译通不过,不过你可以手动修改,添加合适的ado.net类型即可(按照编译出错的提示)。
一、doodads的demo
使用vs2005或更高版本打开“dOOdad_Demo_2005.sln”,注意您是否安装了sql server2000,因为这个demo用到了Northwind数据库,尝试运行该项目,若报数据库连接字符串需要修改,请修改web.config中的appSettings.dbConnection节,运行成功后出现如下的画面:
二、自己搭建一个基于doodads的项目
首先,您必须准备一个数据库,本文的例子是基于sql server 2000的,数据库中至少准备一个表,当然有视图或者存储过程可以使您体验到更多的东西
现在建立一个asp.net web应用程序,添加对“E:Program FilesMyGeneration13ArchitecturesdOOdadsCSharpdOOdad_DemodOOdad_Demo_2005.csproj”(当然您需要修改这个地址为您的电脑上的mg安装路径)的引用,并且在web.config中的appSettings下建立dbConnection节,value就是您的数据库连接字符串
建立App_Code/DAL文件夹,或者您新建一个名为DAL的类库也行;
(可选)建立App_Code/BLL文件夹,或者新建一个名为BLL的类库也行;
现在启动mg,打开并启动如下的模板(红框内的模板是必须的):
这里四个模板分别表示:
Invoke a stored procedure - 生成调用存储过程的c#类,若有则生成
Business Entity - 您可以理解为生成表的操作类,这是最基本的类
Business View-视图操作类,如果您有视图则生成
Concrete Class-聚合类(请饶恕我的翻译),这里生成的类会对应继承是Business Entity中的类,可以理解为BLL类,可以将业务逻辑和DAL隔开,
生成的Business Entity类或stored procedure或Business view请放到刚才建立的DAL文件夹中或者DAL类库中
(若有)生成的Concrete Class请放到BLL文件夹或BLL类库
现在编译一下,是不是成功了!
编译成功了,不代表能够运行成功,如果您尝试执行类似如下的语句将会报错:
Employees emps = new Employees();
emps.LoadByPrimaryKey(42);
错误原因是找不到“proc_您的表名LoadByPrimaryKey”存储过程”,于是我们发现了一个doo