Office Account 2008 中的ORM框架


最近想学习微软的Office Account 2008 的软件架构,Office Account 2008 是微软针对中小型企业设计的财务管理软件,功能包括客户管理,供应商管理,员工管理以及财务管理等。

 

想了解它的ORM实现部分,通过Reflector反编译以后。初步看来所有的实体类都实现了IBaseEntity这个接口。然后再把实体分为IBaseMasterEntityIBaseChildEntity两种。同时Office Account提供了这些接口的基本实现类BaseEntityBaseMasterEntity

 

1. 实体对象和数据库对象的映射

在实体对象和数据库对象的映射方面,采用Attribute编程,比如EntityAttributeFieldAttribute等。

FieldAttribute定义实体对象字段在数据库的属性,比如字段类型,数据长度,是否是主关键字,约束等

 

2. 映射属性元编程实现Attribute2DDL

难点可能就是这个方面,微软利用实体对象Entityattribute属性、类的继承关系和外键关系生成SchemaGraph,然后再在数据库中创建相应的数据表Table,数据视图ViewStoredProcedure。也就是通过这个ORM框架实现了Entity-DataBase Schema的方式,和其他的ORM框架从DataBase Schema生成实体Entity的方式相反。

 

个人认为这种才是完全基于面向对象OOORM框架。

可惜本人的数据结构Graph学得不好,不能看懂它其中由EntityEntity Relation建立的SchemaGraph的代码。

SchemaGraph中含有VertexEdge的定义。可能是通过Graph的周游建立了SchemaGraph,由于OfficeAccount没有这个过程的代码,所以比较难懂。在软件的代码中只定义了软件数据库Schema升级的代码。

 

大家在EntityEntity Relation建立的SchemaGraph方面有什么好的建议吗

 

3. 实体对象和数据库的关系

通过SchemaGraph 建立的数据库,实体对象的每个类都在数据库中有相对应的数据表Table和数据视图View,同时StoredProduce中定义相应的Insert UpdatedeleteMultiRetrieve方法。这样实体对象需要序列化的就可以直接调用SqlServer2005 的存储过程。当然具体的实体对象是不需要看到怎么调用存储过程的。 比如说CustomerAccount实体对象不需要定义怎么调用存储过程,都在BaseEntity中通过Reflect机制提供实现。同时Office Account 利用了Sql Server 2005 的可更新的视图对象,也就是在数据视图中建立InsteadOf 触发器Trigger

 

你可能感兴趣的:(Office)