您的位置:首页 > 其它

ORM映射框架总结--映射桥梁

2010-04-02 12:49 295 查看
1. 感言

写博客之前先自我吹嘘一下,给这些文章来些自我介绍。

半年前自己借用了5个多月的业务时间写了一个个人ORM映射框架。在之前的博

客中也有过写过该框架的相关介绍。半年前的那个ORM只不过是自己想象的关系映射的一个雏形,那一段曾经让自己骄傲过得代码的确存在着太多的问题,但是我始终没有放弃过对它的修改。又过了半年,这个ORM映射框架在之前的基础上有了很大的改进。在此与大家分享一下,希望大家共同探讨,共同学习。

2. 框架整体介绍

说道这里,其实这个ORM框架仍然存在这很大的问题。不过这个是自己的第二期目标,到现在这个程度算是完成了.

目前出现的ORM 框架还是比较多的。本人写这个ORM不是为了说要推翻某个理论或者要和Linq,Nhibernate 一教高下,目前一个人之力几乎不可能。写此框架只是为了更近一步的了解程序架构。

设计思路其实很简单,和其余的ORM框架一样。通过某种关系来维持实体对象和数据库之间的关系,然后通过实体对象的操作来实现数据库的操作。

ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Nhibernate 就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq 则是使用特性(Attribute) 来描述的。

我自己写的这个出于学习特性这一知识,于是采用了特性(Attribute)来描述实体对象。

ORM 映射功能的实现组要由如下几个组建组成:

(1)
实体—数据库
映射特性关系

(2)
实体分析器

(3)
Sql 语句生成组建

(4)
数据库操作库

框架整体结构图:

代码

1 /**
2 * 2010-1-28
3 *
4 * 情 缘
5 *
6 * 实体集合属性特性,用于描述某个实体作为另外一个实体
7 * 的一个集合属性的时候与数据库表之间的关系
8 *
9 * 这个特性使用了 sealed 修饰,说明该特性类不能再被继
* 承。但是这个实体类不是在继承Attribute,而是继承
* LinkTableAttribute。因为这两者描述的属性具有相同的
* 特性。只需要让它继承LinkTableAttribute 保留父类的
* 属性就可以了。 LinkTablesAttribute,LinkTableAttribute
* 这两个特性类具有相同的属性,使用不同的类名只是为了
* 区分修饰的属性形态有所不同
*
* */

using System;

namespace CommonData.Model.Core
{
public sealed class LinkTablesAttribute:LinkTableAttribute
{
/// <summary>
/// 无参数构造方法
/// </summary>
public LinkTablesAttribute()
{
}

/// <summary>
/// 部分参数构造方法,构造该特性实例的时候,
/// 初始化部分属性,并且调用的是父类的构造
/// 方法
/// </summary>
/// <param name="name">该实体属性对应的数据库表名</param>
/// <param name="dataType">该实体属性对应的数据类型</param>
/// <param name="keyName">该实体对应的主键类型</param>
/// <param name="className">对应的实体的全路径类型</param>
public LinkTablesAttribute(string name, Type dataType, string keyName, string className)
: base(name,dataType,keyName,className)
{ }

/// <summary>
/// 全参数构造方法,构造该特性实例的时候
/// 初始化全部属性 ,并且调用的是父类的构造
/// 方法
/// </summary>
/// <param name="name">该实体属性对应的数据库表名</param>
/// <param name="sqlPrefix">该实体属性对应的数据库表名前缀</param>
/// <param name="dataType">该实体属性对应的数据类型</param>
/// <param name="keyName">该实体对应的主键类型</param>
/// <param name="className">对应的实体的全路径类型</param>
public LinkTablesAttribute(string name, string sqlPrefix, Type dataType, string keyName, string className)
:base(name,sqlPrefix,dataType,keyName,className)
{

}
}
}
特性说明:实体集合属性特性,用于描述某个实体作为另外一个实体的一个集合属性的时候与数据库表之间的关系

这个特性使用了 sealed 修饰,说明该特性类不能再被继承。但是这个实体类不是在继承Attribute,而是继承LinkTableAttribute。 因为这两者描述的属性具有相同的特性。只需要让它继承LinkTableAttribute 保留父类的属性就可以了。 LinkTablesAttribute,LinkTableAttribute这两个特性类具有相同的属性,使用不同的类名只是为了区分修饰的属性形态有所不同

源码点击下载

(注: ORM涉及内容比较多,后续期待。本文只是一个开端,有兴趣的可以与本人探讨)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: