Office Account 2008 中的ORM框架
最近想学习微软的Office Account 2008 的软件架构,Office Account 2008 是微软针对中小型企业设计的财务管理软件,功能包括客户管理,供应商管理,员工管理以及财务管理等。
想了解它的ORM实现部分,通过Reflector反编译以后。初步看来所有的实体类都实现了IBaseEntity这个接口。然后再把实体分为IBaseMasterEntity和IBaseChildEntity两种。同时Office Account提供了这些接口的基本实现类BaseEntity和BaseMasterEntity。
1. 实体对象和数据库对象的映射
在实体对象和数据库对象的映射方面,采用Attribute编程,比如EntityAttribute,FieldAttribute等。
FieldAttribute定义实体对象字段在数据库的属性,比如字段类型,数据长度,是否是主关键字,约束等
2. 映射属性元编程实现Attribute2DDL
难点可能就是这个方面,微软利用实体对象Entity的attribute属性、类的继承关系和外键关系生成SchemaGraph,然后再在数据库中创建相应的数据表Table,数据视图View和StoredProcedure。也就是通过这个ORM框架实现了Entity-》DataBase Schema的方式,和其他的ORM框架从DataBase Schema生成实体Entity的方式相反。
个人认为这种才是完全基于面向对象OO的ORM框架。
可惜本人的数据结构Graph学得不好,不能看懂它其中由Entity和Entity Relation建立的SchemaGraph的代码。
SchemaGraph中含有Vertex,Edge的定义。可能是通过Graph的周游建立了SchemaGraph,由于OfficeAccount没有这个过程的代码,所以比较难懂。在软件的代码中只定义了软件数据库Schema升级的代码。
大家在Entity和Entity Relation建立的SchemaGraph方面有什么好的建议吗
3. 实体对象和数据库的关系
通过SchemaGraph 建立的数据库,实体对象的每个类都在数据库中有相对应的数据表Table和数据视图View,同时StoredProduce中定义相应的Insert, Update,delete,MultiRetrieve方法。这样实体对象需要序列化的就可以直接调用SqlServer2005 的存储过程。当然具体的实体对象是不需要看到怎么调用存储过程的。 比如说CustomerAccount实体对象不需要定义怎么调用存储过程,都在BaseEntity中通过Reflect机制提供实现。同时Office Account 利用了Sql Server 2005 的可更新的视图对象,也就是在数据视图中建立InsteadOf 触发器Trigger。