基于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(高级群)(已满)
链接
作者:魏琼东
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。