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


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

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

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

    `XIJ$VQ5}GL[`}RNO2P`AZ2

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

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

    %A[87HSDHO$_V[EFR$%ZO}9

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

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

    $D_0WNI7C5UOQ9%D_M_}(2A

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

    ClassDiagram1

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

  • 相关阅读:
    在归并排序中对小数组采用插入排序实现代码
    PAT 1032. Sharing
    1031. Hello World for U
    PAT 1030. Travel Plan
    PAT 1029. Median
    PAT 1028. List Sorting
    PAT 1027. Colors in Mars
    PAT 1026. Table Tennis
    PAT 1025. PAT Ranking
    Several Important Commands in GMT
  • 原文地址:https://www.cnblogs.com/eastjade/p/2038618.html
Copyright © 2020-2023  润新知