基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员
闲话不说了,接着前面的文章继续向大家汇报AgileEAS.NET 4.0本次重构的内容,AgileEAS.NET ORM体系的完善:本次重构调整了原有ORM的技术体系,并增加了新的Orm设计,同步兼容和支持原有Orm体系,原有的程序代码不经任务改变即可运行在新的平台之上。 有关于AgileEAS.NET原有的Orm体系请参考AgileEAS.NET之数据关系映射ORM与AgileEAS.NET之ORM访问器两篇文章。 本次Orm技术的更新最大的地方是增加了新的Orm对象定义方案,原有的Orm是采用的基于类型于表格====>对象的数据及无数据存储方案: 即原有Orm体系对某一对象的定义需要两个类来完成Table和Entity, Table用于定义实体的元数据及复杂查询业务,Entity用于实现O-R记录的转换,对于具体实体的数据存储在Entity之中,即Entity不存储O-R映射的元数据定义,用于提高性能。 本次重构增加了一个新的ORM对象定义DataEntity,我们姑且称他为数据实现吧,新的Orm围绕DataEntity进行展开,数据及定义如下表所示: 新的ORM对象定义代码如下: 1: /// <summary> 2: /// 实体对象NRCMItem(新农合药品/诊疗目录)。 3: /// </summary> 4: [Serializable()] 5: [Table("dbo.NRCMITEM")] 6: partial class NRCMItem: DataEntity<NRCMItem> 7: { 8: public NRCMItem() 9: { 10: } 11: 12: protected NRCMItem(SerializationInfo info, StreamingContext context) 13: : base(info, context) 14: { 15: } 16: 17: /// <summary> 18: /// 药品内码。 19: /// </summary> 20: [Column("Code","药品内码"),PrimaryKey] 21: public string Code 22: { 23: get; 24: set; 25: } 26: 27: /// <summary> 28: /// 药品分类 。 29: /// </summary> 30: [Column("Item","药品分类"),PrimaryKey] 31: public string Item 32: { 33: get; 34: set; 35: } 36: 37: /// <summary> 38: /// Name 。 39: /// </summary> 40: [Column("Name","Name")] 41: public string Name 42: { 43: get; 44: set; 45: } 46: 47: /// <summary> 48: /// 规格。 49: /// </summary> 50: [Column("Spec","规格")] 51: public string Spec 52: { 53: get; 54: set; 55: } 56: 57: /// <summary> 58: /// 单位 。 59: /// </summary> 60: [Column("Unit","单位")] 61: public string Unit 62: { 63: get; 64: set; 65: } 66: 67: /// <summary> 68: /// 单价。 69: /// </summary> 70: [Column("Price","单¥价?")] 71: public decimal Price 72: { 73: get; 74: set; 75: } 76: 77: /// <summary> 78: /// 报销比例。 79: /// </summary> 80: [Column("Rate","报销比例")] 81: public decimal Rate 82: { 83: get; 84: set; 85: } 86: 87: /// <summary> 88: /// 保内外。 89: /// </summary> 90: [Column("Cate","保内外")] 91: public string Cate 92: { 93: get; 94: set; 95: } 96: 97: /// <summary> 98: /// 甲乙分类。 99: /// </summary> 100: [Column("PClass","甲乙分类")] 101: public string PClass 102: { 103: get; 104: set; 105: } 106: 107: /// <summary> 108: /// 助记码。 109: /// </summary> 110: [Column("InputCode","助记码")] 111: public string InputCode 112: { 113: get; 114: set; 115: } 116: } 117: 新的Orm使用属性定义方式处理O-R的映射定义在运行,为了提高元数据的处理性能,在Orm运行时使用了元数据缓存以提高数据处理效率,同时,新的Orm也吸引了原有Orm技术中的数据索引器技术,以获取更高的数据张载性能,代码如下: 1: /// <summary> 2: /// 实μ体?对?象ó GbCode(国ú标ê码?)。£ 3: /// </summary> 4: [Serializable()] 5: [Table("im.GBCODE"),Index] 6: partial class GbCode: DataEntity<GbCode> 7: { 8: public GbCode() 9: { 10: } 11: 12: protected GbCode(SerializationInfo info, StreamingContext context) 13: : base(info, context) 14: { 15: } 16: 17: /// <summary> 18: /// 目录。 19: /// </summary> 20: [Column("CATEGORY","目?录?"),PrimaryKey] 21: public int Category 22: { 23: get 24: { 25: return this.GetValue<int> ("CATEGORY"); 26: } 27: set 28: { 29: this["CATEGORY"] = value; 30: } 31: } 32: 33: /// <summary> 34: /// 编码。 35: /// </summary> 36: [Column("CODE","编码"),PrimaryKey] 37: public int Code 38: { 39: get 40: { 41: return this.GetValue<int> ("CODE"); 42: } 43: set 44: { 45: this["CODE"] = value; 46: } 47: } 48: 49: /// <summary> 50: /// 名称。 51: /// </summary> 52: [Column("NAME","名称")] 53: public string Name 54: { 55: get 56: { 57: return this.GetValue<string> ("NAME"); 58: } 59: set 60: { 61: this["NAME"] = value; 62: } 63: } 64: 65: /// <summary> 66: /// 排序码 。 67: /// </summary> 68: [Column("SORTCODE","排序码")] 69: public int SortCode 70: { 71: get 72: { 73: return this.GetValue<int> ("SORTCODE"); 74: } 75: set 76: { 77: this["SORTCODE"] = value; 78: } 79: } 80: 81: /// <summary> 82: /// 标准码。 83: /// </summary> 84: [Column("STANDARDCODE","标准码")] 85: public string StandardCode 86: { 87: get 88: { 89: return this.GetValue<string> ("STANDARDCODE"); 90: } 91: set 92: { 93: this["STANDARDCODE"] = value; 94: } 95: } 96: 97: /// <summary> 98: /// 符号。 99: /// </summary> 100: [Column("SYMBOL","符号")] 101: public string Symbol 102: { 103: get 104: { 105: return this.GetValue<string> ("SYMBOL"); 106: } 107: set 108: { 109: this["SYMBOL"] = value; 110: } 111: } 112: 113: /// <summary> 114: /// 输入码。 115: /// </summary> 116: [Column("INPUTCODE1","输入码")] 117: public string InputCode1 118: { 119: get 120: { 121: return this.GetValue<string> ("INPUTCODE1"); 122: } 123: set 124: { 125: this["INPUTCODE1"] = value; 126: } 127: } 128: 129: /// <summary> 130: /// 输入码 。 131: /// </summary> 132: [Column("INPUTCODE2","输入码")] 133: public string InputCode2 134: { 135: get 136: { 137: return this.GetValue<string> ("INPUTCODE2"); 138: } 139: set 140: { 141: this["INPUTCODE2"] = value; 142: } 143: } 144: } 145: 以上以不同风格的代码生成方式,在新的对象设计器中都提供了支持,通过生成器解决方案选择选项之中进行不同的选择: 新的Orm中采用属性标记的方式定义O-R元数据,供提供如下属性: Column属性 标记的实体属性之上,用于定义实体属性与数据库字段的关联关系。 PrimaryKey属性 标记的实体属性之上,用于定义特定的某个列是否为数据库表的主键。 Identity属性 标记的实体属性之上,用于定义特定的某个列是否为自动增长列。 DefaultValue属性: 标记的实体属性之上,用于定义特定的某个列的默认值。 DataSize属性 标记的实体属性之上,用于定义特定的某个列的的数据范围,包含长度及小数位数。 新的ORM对象DataEntity的CRUD操作和原有Orm实例Entity类似,即采用IOrmAccessor的CRUD操作方法: 1: /// <summary> 2: /// 读数据实体。 3: /// </summary> 4: /// <typeparam name="T">实体类型。</typeparam> 5: /// <param name="dataEntity">数据实体。</param> 6: /// <returns>从数据库读出的数据对象。</returns> 7: T Read<T>(DataEntity<T> dataEntity) where T : IDataEntity; 8: 9: /// <summary> 10: /// 插入数据实体。 11: /// </summary> 12: /// <param name="dataEntity">数据实体。</param> 13: void Insert<T>(DataEntity<T> dataEntity) where T : IDataEntity; 14: 15: /// <summary> 16: /// 修改数据实体?。 17: /// </summary> 18: /// <param name="dataEntity">数据实体。</param> 19: void Update<T>(DataEntity<T> dataEntity) where T : IDataEntity; 20: 21: /// <summary> 22: /// 删除数据实体?。 23: /// </summary> 24: /// <param name="dataEntity">数据实体?。</param> 25: void Delete<T>(DataEntity<T> dataEntity) where T : IDataEntity; 26: 以及实体基类DataEntity<T>所提供的CRUD方法: 1: /// <summary> 2: /// 刷新当前数据对象ó。 3: /// </summary> 5: void Refresh(); 6: 7: /// <summary> 8: /// 刷新当前数据对象。 9: /// </summary> 11: void Read(); 12: 13: /// <summary> 14: /// 保存当前数据对象。 15: /// </summary> 17: void Save(); 18: 19: /// <summary> 20: /// 插入当前数据对象。 21: /// </summary> 23: void Insert(); 24: 25: /// <summary> 26: /// 更新当前数据对象。 27: /// </summary> 29: void Update(); 30: 31: /// <summary> 32: /// 从数据库中删除当前数据对象ó。 33: /// </summary> 35: void Delete(); 36: Orm之中的除CRUD之后的很大一部业务是数据的查询服务,AgileEAS.NET平台中对于新的Orm对象DataEntity提供了两种数据查询实现,第一种查询实现方法是采用原有Orm技术中的查询思想,采用动态组合生成的查询条件树进行数据查询,DataEntity<T>之中定义了如下数据选择操作: 1: /// <summary> 2: /// 实体查询。 3: /// </summary> 4: /// <param name="condition">数据查询条件。</param> 5: /// <returns>数据实体集合。</returns> 6: public static IList<T> Select(Condition condition); 同时在新的Orm技术之增加了对Linq技术的实现,大大的方便了数据查询的操作,有关于这部分内容,我将会在下一篇文章中给大家详细的介绍。 下载说明 有关于平台最新版本的最新发布版本的程序集、类库手册、相关资料,请大家从AgileEAS.NET平台的官网http://www.smarteas.net/进行下载,官网设有独立的下载页面,从这里下载:官网下载。 CallHot写过一个系列的基于AgileEAS.NET平台的开发案例,请大家通过AgileEAS.NET平台开发Step By Step系列-药店系统-索引及AgileEAS.NET敏捷开发平台及案例下载(持续更新)-索引、AgileEAS.NET平台开发实例-药店系统-视频教程系列-索引一系列文章进行下载。 如何联系 如果您在使用AgileEAS.NET开发平台中有什么问题,请使用如下几种联系方式或者沟通方式。 1、官方网站: AgileEAS.NET平台:http://www.smarteas.net/ 敏捷软件工程实验室:http://www.agilelab.cn/ 2、AgileEAS.NET平台交流群: AgileEAS.NET平台交流群:120661978(超级群)[新建] AgileEAS.NET平台交流群:125643764(高级群)[新建] AgileEAS.NET平台交流群:147168308(高级群)[新建] 3、系统架构交流群: 系统架构交流群:9105332(高级群)(已满) 系统架构交流群1:124825459(高级群)(已满) 系统架构交流群2:49124441(高级群)(已满) 系统架构交流群3:47025564(高级群)(已满) 链接 AgileEAS.NET平台开发指南-文章索引 AgileEAS.NET应用开发平台介绍-文章索引 AgileEAS.NET平台应用开发教程-案例计划 作者:魏琼东出处:http://www.cnblogs.com/eastjade关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教!本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。 本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/archive/2011/05/06/2038618.html,如需转载请自行联系原作者