一直用LINQ开发,很好用,但LINQ也很有局限性,只支持SQL,反射机制使性能相对较低。NH是从JAVA上过来的,本人对.NET情有独中,像处女情节一样,不喜欢JAVA的二手货,而且NH具有JAVA的配置文件配死人不偿命和手动慢慢搞的特点,所以寻找更好的ORM,研究了一把DataRabbit. 果然超强大,使用时崇拜一下非常senior的朱哥。

     dataRabbit它的实体有生成器生成,所以不用费工作量,而操作更是方便,效率跟ODBC一样高效。只要几行代码,就能方便完成,这里是朱哥提供的一个例子:就算是Junior相信也看看就明白了

DataConfiguration dbAddress = new DataConfiguration(DataBaseType.SqlServer ,"127.0.0.1", "sa", "chenqidudu", "TestMap" ,null)

             IADOBase adoBaseSqlServer
= ADOBaseFactory.CreateADOBase(dbAddress);
             IDynamicAccesser studentAccesser
= adoBaseSqlServer.GetDynamicAccesser("Student");
             Student stu
= new Student();
             stu.ID
= 1000;
             stu.Name
= "Sky";
             stu.Age
= 27;
            studentAccesser.Insert(stu);

    这就是所有了,不需要任何配置文件,不需要任何其它附加的东西,上面的代码已经可以正常工作。是不是很简单了!
     下面在举个对事务支持的例子,仍然是Student表:

DataConfiguration dbAddress = new DataConfiguration(DataBaseType.SqlServer ,"127.0.0.1", "sa", "chenqidudu", "TestMap" ,null)
             IADOBase adoBaseSqlServer
= ADOBaseFactory.CreateADOBase(dbAddress);
             IDynamicAccesser studentAccesser
= adoBaseSqlServer.GetDynamicAccesser("Student");
             Student stu
= new Student();
             stu.ID
= 1000;
             stu.Name
= "Sky";
             stu.Age
= 27;

             Student stu2
= new Student();
             stu.ID
= 1001;
             stu.Name
= "Sky2";
             stu.Age
= 30;

             IDbTransaction trans
= null;
             DataRabbit.Transction.ITransactionHelper transHelper
= adoBaseSqlServer.GetTransactionHelper();
            
try
             {
                 trans = transHelper.StartTransaction() ;
                 studentAccesser.Insert(stu ,trans);
                 studentAccesser.Update(stu2 ,trans);
                 transHelper.CommitTransaction(trans);
//提交事务
             }
            
catch
             {
                 transHelper.RollTransaction(trans);
//回滚事务
             }

这种轻便的ORM是怎么实现的了?下面是它的原理(仍然以Student表为例):
(1)获取Student表的表结构,即数据大纲,在DataRabbit称为DataSchema。
(2)根据DataSchema动态构建各个System.Data.IDbDataParameter参数,然后使用这些IDbDataParameter组合动态构建IDbCommand命令,并依据Insert操作动态生成对应的CommandText。
(3)将Entity对象(即上例中的stu实例)的各个属性通过反射赋值给对应的IDbDataParameter.Value。
(4)执行IDbCommand。

     DataRabbit的ORM也只是内置了对SqlServer和Oracle的支持,如果需要支持其它类型的数据库,则可以通过附加插件的方式做到。这就是朱哥框架最牛B的地方了

   Linq执行一百万记录要7秒,DataRabbit只要零点几秒,Linq不是它的lamadia表达式和强大的对像查询功能,我都不会再用它了。好了,余下的时间,研究下朱哥的插件式编程和隔壁公司的小美女吧。

posted on 2009-02-25 13:25  许维光  阅读(723)  评论(1)    收藏  举报