本文共 1893 字,大约阅读时间需要 6 分钟。
通常的ORM实现基于配置或注释,由反射或Emit生成相应的Sql语句,然后将Sql发送给数据库解析Sql字符串生成AST再交给优化器处理后执行,返回的数据再经由反射或Emit转换为相应的实体实例。作者认为上述方式主要存在以下两个问题:
由于作者追求极致简单的系统架构以及丝般顺滑的开发体验,所以作者采用了另类的方式在框架内实现了ORM,之于另类在什么地方我们先通过一些简单示例后再来说明一下实现原理。
还是用系统自带的Emploee模型作为示例,在IDE新建服务模型添加以下代码保存发布后可通过主菜单->Service->Invoke运行测试:
//事务新建两条记录var emp1 = new Entities.Emploee();emp1.Name = "Rick";emp1.Account = "rick@appbox.dev";emp1.Birthday = new DateTime(1977, 3, 16);var emp2 = new Entities.Emploee();emp2.Name = "Johne";emp2.Account = "johne@appbox.dev"emp2.Birthday = new DateTime(1979, 1, 2);var txn = await Transaction.BeginAsync();try { await EntityStore.SaveAsync(emp1, txn); await EntityStore.SaveAsync(emp2, txn); await txn.CommitAsync();} catch (Exception ex) { txn.Rollback();}//查询记录var q = new TableScan();q.Filter(t => t.Name == "Rick");var emps = await q.ToListAsync();//更新记录emps[0].Name = "Rick Lu";await EntityStore.SaveAsync(emps[0]);//删除记录await EntityStore.DeleteAsync(emps[0]);
以上只是已实现的一些Api示例,复杂的如根据索引查询、聚合查询等Api正在设计开发中。
这部分实现重度依赖Roslyn功能,服务端在开发人员登录至IDE后会通过Roslyn生成虚拟项目。
这部分实现参考以下流程图,需要注意的是存储引擎是基于RocksDB的,实体数据转换为KV数据(如Key=Id, Value=[字段标识:字段值;字段标识:字段值]),这样转换过程就不需要使用反射或Emit。
作者做了简单的性能测试(单节点I74C8G虚拟机):
本篇主要介绍了框架集成的ORM的另类实现,上的运行时已经更新可测试。如果您有问题或Bug报告,请留言或在提交Issue。
转载地址:http://nfozz.baihongyu.com/