Moon.ORM全攻略.Moon.ORM4.3稳定版(及代码生成器企业版)发布.

Moon.ORM技术全攻略
请使用者升级到此版本(修复hashcode bug)

 一.绪论

      本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文从实际出发解析Moon.ORM.(技术群:

216965349
)

 

关于实体框架
       微软不久前开源了EF5.0,获取了其代码发现并不能编译,大致看了其代码.优雅便捷可谓正统,但其实战性仍待提高.

       1)Linq不能为我们生成理想的sql,而且linq自身的性能有损失.这是EF不得不面主要的问题.没有完美的东西只有平衡点--没有银弹

       2)linq不能解决复杂度较高的查询;而且微软一开始试图忽视数据库的存在,但这是绝对不可能的.大家自己去思考.

       3)多数据库多数据源问题解决较为麻烦;

       4)仅仅支持.net 4.5,目前无法在windows 2003上运行.

EF 的优点诸多不必多说.    Linq的优缺点似乎也成了EF的优缺点之一.微软想通过Linq让我们以一种面向数据对象的方式来思考,及持久化他们的数据.可是我们可想想数据库的中 的记录难道就不是对象了?Linq给人以优雅和便捷我想这是他明显的优势,然后就是匿名对象在其中发挥的重要作用.

...

 二.Moon.ORM的特色及优势

      ----但凡众多的智慧都是及其简单的,但不为人所知.这也是Moon.ORM的主要特色:大道至简.

      1.高性能是Moon.ORM优势之一,也是我架构它的主要目的之一,如以前我说的那样,是为了弥补项目中遇到的性能问题而设计.可以说对于整个框架数据 处理上采用了纯的ADO.NET进行封装同时结合了EMIT达到快速生成实体的目的(当然到时候也可以用4.0的代码生成器完成纯ADO.NET的开 发).我不得不承认linq和lambda语句带来的优雅,但同时我们需要承认linq的局限性.或许有人说可以通过手段进行一些弥补,如有人以提高 linq性能来写文章一样,但我们需要承认两个事实,每次对linq的系统识别后才能进行优化,也就是说,linq的天性决定有性能损失.再次linq不 是银弹,因为负责的场合linq几乎是做不到的,何况linq生成的sql不一定是你真正要的.(注意:我不是敌对linq,而是说实话,正如曾说:实际开发中没有银弹,只有平衡点,适合需求能解决实际情况的架构那就够了)而且我也没有必要再去写一个框架,做一个类似Nhibernate,或者实体框架的东西.做东西我一直认为需要做一个能有自我的特色和优势.

      2.易用性,我想用过Moon.ORM的应该可以知道这点.配置简单,智能感知,代码生成器的辅助,会sql就可会用Moon.

      3.多数据库多数据源支持.在同一个项目中我们需要处理这种情况时,Moon.ORM是你最好的选择.如你系统默认为MSSQL,现在要同时使用 MYSQL,你只需要实例化一个引擎就可以.DBFactory.GetEntity (pjy_AdminRoleTable.RoleID.BiggerThan(0),new MYSQL("连接字符串"));当然你可以把引擎做成全局的.

      4.语法糖功能.个人使用的结果是大概能满足我实际需求的70%以上的功能.

      5..NET 2.0原生支持,这个就不用说了.

      6.数据库转变问题,如果你发现你有一天你的数据库需要从mysql转变到mssql,你只需要转变你的配置文件即可.(当然sql语法差异的问题,你需要自己注意了,如果你在用原生的sql进行操作时).

三.维护问题.

      有人曾说'都没源代码,所以我不能用'.我不能自比微软,但我们可以换一个位置想想:知道.net framework 3.5 sp1中的bug吗?微软的库中也会有bug信吗?Moon.ORM标准版,一律免费使用(包括API文档等)和群技术支持.对于企业用户我会提供专门的 服务和技术支持以及更加美观强大易用的企业版Moon.orm代码生成器工具及技术培训资料.

四.同类产品对比.

五. 绝对性能优势

      3.9版本后已将查询性能提升到了极致≈纯sql查询的性能.

六.技术指导(主要提供绝大部分的情况,供参考,具体请看API文档)

      一.查询操作.

        1.查询一条记录(一个实体)

            Administrator newUser=DBFactory.GetEntity(AdministratorTable.ID.Equal(userID).And(
AdministratorTable
.Age.Equal(12)));

        2.查询多条记录(多个实体)

            var list=DBFactory.GetEntities(AdministratorTable.ID.BiggerThan(9));

        3.嵌套查询(codeID作为外键指向Administrator的ID)

            var list=DBFactory.GetEntities(AdministratorTable.ID
                                                          .Equal(AttachmentTable.codeID.SelectWhere(AttachmentTable.fileName.Equal("ee.txt"))));

        4.对于复杂的多表查询,使用代码生成器,把你的sql复制过去,然后它帮助你生成实体,最终

            NewOBJ newUser=DBFactory.GetEntity(sql语句);

        5.单一数据查询.

            string userName=DBFactory.GetOneField<string>(AdministratorTable.UserName,AdministratorTable.ID.BiggerThan(0));

             (注意可能报异常,比如查出来的数据为DBNull).

        6.记录条数查询.

            long count=DBFactory.GetCount(AdministratorTable.UserName,AdministratorTable.ID.BiggerThan(0));

        7. 返回其他的格式.可以参考API看DB

         (调用方法如:DBFactory.DefaultDB.GetDataSet("sql语句");)DefaultDB的类型为DB,其API可看帮助文档;

 

 

        8. 查询单一字段.
       var userName=DBFactory.GetOneField<string>(UserTable.UserName,UserTable.Age.Equal(12).And(UserTable.Tel.Equal("qsmy")));
       

        9.指定字段对象查询.

       var user=DBFactory.GetEntity(UserTable.Age+UserTable.UserName,UserTable.ID.Equal(12));

        10.复杂查询功能.Moon给出了三种解决方案.

          1.代码生成器生成实体,把您的sql语句(无论多么复杂)放入代码生成器,它会自动给你生成强类型实体,如第4条说的.

          2.智能实体,不需要代码生成器,如下

             var list=DBFactory.GetIntelligentEntities("select * from [User]");
            Console.WriteLine(list[index]["username"].To<string>());(注意字段全是小写)

            

            var user=DBFactory.GetIntelligentEntity("select * from [User] where age>3");
            Console.WriteLine(user["username"].To<string>());

          3.动态编译实体,同样不需要代码生成器(Moon5.0会与大家相见)

           

           
var list=DBFactory.GetAutoEntities("相当复杂的一个sql查询语句","自定义类名");
for(var a in list){
int count=a.Count;
string country=a.Country;
}

 

   

 
      二.数据添加操作.
            Administrator admin=new Administrator();
            admin.UserName="秦仕川"+DateTime.Now;
            admin.Password="qsmy";
            //开启事务操作
            admin.StartTransaction(true);
            //返回主键值
            int userID=Convert.ToInt32(DBFactory.Add(admin));
      三.数据删除操作.
            //返回删除的条数
            long count=DBFactory.DeleteWhen(AdministratorTable.ID.BiggerThan(0));
      四.数据修改操作. 
            Administrator admin=new Administrator();
            admin.UserName="秦仕川"+DateTime.Now;
            admin.Password="qsmy";
            admin.SetOnlyMark(AdministratorTable.ID.BiggerThan(0));
            //开启事务操作
            admin.StartTransaction(true);
            //返回主键值
            DBFactory.Update(admin);

 

七.需要明白的Moon.ORM设计前提

   1.对于数据库的设计,每一个表必须要有主键;

   2.由业务决定逻辑的主键设计方案是错误的,所以主键是不能被业务牵制的,因为业务是变动的.Moon.ORM需建立独立于业务

之外的.所以主键的设计MOON选择的是guid或者自增的情况(建议用自增的方式).

 

八.使用说明

 

   使用说明:代码生成器及使用说明

 

 

 

最新版下载地址 

 

 

 

示例代码


 

posted @ 2012-12-01 17:13  [秦时明月]  阅读(1999)  评论(9编辑  收藏  举报