Moon.ORM3.9发布,技术全攻略.最快的ORM发布.
一.绪论
本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从实际出发解析Moon.ORM.(技术群:21696534)
二.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<Person>(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代码生成器工具及技术培训资料.
四.同类产品对比.
五. 4.0及功能预览
4.0将在3.9的基础上支持oracle.对于数据查询操作会进行二级缓存处理进一步提示性能.提供更加强大的事务功能. 实际上待发布的版本中我已将查询性能提升到了极致≈纯sql查询的性能.有图为证.
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
* 由SharpDevelop创建。
* 用户: qinshichuan
* 日期: 2012-6-7
* 时间: 20:52
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;
using CYQ.Data;
using MoonDB;
using Moon.Orm;
namespace TESTCYQ
{
class Program
{
public static void Main(string[] args)
{
//
var t11=DateTime.Now.Ticks;
for (int i = 0; i < 800; i++) {
var newUser=DBFactory.GetEntities<Administrator>(AdministratorTable.ID.BiggerThan(0));
}
var t22=DateTime.Now.Ticks;
Console.WriteLine("moon的执行时间是---"+(t22-t11));
//
var t1=DateTime.Now.Ticks;
for (int i = 0; i < 800; i++) {
using(MAction action = new MAction("Administrator"))
{
var newUser=action.Select("ID>0").ToList<Administrator>(true);
}
}
var t2=DateTime.Now.Ticks;
Console.WriteLine(" cyq的执行时间是---"+(t2-t1));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
六.技术指导(主要提供绝大部分的情况,供参考,具体请看API文档)
一.查询操作.
1.查询一条记录(一个实体)
2.查询多条记录(多个实体)
3.嵌套查询(codeID作为外键指向Administrator的ID)
.Equal(AttachmentTable.codeID.SelectWhere(AttachmentTable.fileName.Equal("ee.txt"))));
4.对于复杂的多表查询,使用代码生成器,把你的sql复制过去,然后它帮助你生成实体,最终
NewOBJ newUser=DBFactory.GetEntity<NewOBJ >(sql语句);
5.单一数据查询.
(注意可能报异常,比如查出来的数据为DBNull).
6.记录条数查询.
long count=DBFactory.GetCount(AdministratorTable.UserName,AdministratorTable.ID.BiggerThan(0));
7. 返回其他的格式.可以参考API看DB
(调用方法如:DBFactory.DefaultDB.GetDataSet("sql语句");)
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))
admin.UserName="秦仕川"+DateTime.Now;
admin.Password="qsmy";
admin.SetOnlyMark(AdministratorTable.ID.BiggerThan(0));
//开启事务操作
admin.StartTransaction(true);
//返回主键值
DBFactory.Update(admin);
1.对于数据库的设计,每一个表必须要有主键;
2.由业务决定逻辑的主键设计方案是错误的,所以主键是不能被业务牵制的,因为业务是变动的.Moon.ORM需建立独立于业务
之外的.所以主键的设计MOON选择的是guid或者自增的情况(建议用自增的方式).
/Files/humble/TESTCYQ.zip