基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员

时间:2021-10-13 03:54:17

      闲话不说了,接着前面的文章继续向大家汇报AgileEAS.NET 4.0本次重构的内容,AgileEAS.NET ORM体系的完善:本次重构调整了原有ORM的技术体系,并增加了新的Orm设计,同步兼容和支持原有Orm体系,原有的程序代码不经任务改变即可运行在新的平台之上。

      有关于AgileEAS.NET原有的Orm体系请参考AgileEAS.NET之数据关系映射ORMAgileEAS.NET之ORM访问器两篇文章。

      本次Orm技术的更新最大的地方是增加了新的Orm对象定义方案,原有的Orm是采用的基于类型于表格====>对象的数据及无数据存储方案:

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员

 

     即原有Orm体系对某一对象的定义需要两个类来完成Table和Entity, Table用于定义实体的元数据及复杂查询业务,Entity用于实现O-R记录的转换,对于具体实体的数据存储在Entity之中,即Entity不存储O-R映射的元数据定义,用于提高性能。

     本次重构增加了一个新的ORM对象定义DataEntity,我们姑且称他为数据实现吧,新的Orm围绕DataEntity进行展开,数据及定义如下表所示:

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员

 

     新的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:   

      以上以不同风格的代码生成方式,在新的对象设计器中都提供了支持,通过生成器解决方案选择选项之中进行不同的选择:

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员

     新的Orm中采用属性标记的方式定义O-R元数据,供提供如下属性:

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM体系的改进与ORM的新成员

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平台应用开发教程-案例计划