Tech Share Club
浅谈.NET中ORM的设计和实现
donglei
目录
· ORM的 概念
· ORM的 使用场合
· .NET中常 见的ORM
· ORM的 设计
· ORM的 具体实现
· 补充和说明
· Question And Answer
ORM的概念
· ORM (Object-Relationl Mapping )即对象关系映射。它的作用是在关系型数据库和对象之 间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样 操 作它 就可以了 。
优点
· 面对对象
· 加快开发速度
· 方便转移数据库
· 安全性较好
缺点
· 不够灵活(sql,多表,部分字段)
· 过分依赖,不知道具体实现。
· 性能损耗(sql,反射,实例化)
· 学习成本
适用原则
· 扬长避 短。适度使用。
· 简单的操作使用ORM。
· 对于需 要灵活操作的模块使用其他方法。
ORM的使用场合
· 什么场合需要使用ORM?
· 实现逻辑复杂
· 对性能要求不是十分苛刻
· 开发时间紧迫
· 有数据库迁移需求
· 了解ORM的内部实现
· 不适宜使用的场合
· 逻辑简单
· 效率要求高
· 无数据库迁移需求
.NET中常见的ORM
· NHibernate
· Linq To Sql
· ADO.NET Entity Framework
· iBATIS.NET
· Nbear
· …
ORM的设计
· 基本要求
· 基本的增删改查
· 可扩展的方法(支持连表查询,sql直接查询)
· 多数据库支持
· 轻量级
ORM的设计
· 思路:
· 实体->反射->mapping->sql语句->结果集->
转换成实体
· 基本方法:增删改查
· Insert(Entity T)
· Delete: DeleteByID(id),Delete(Entity T)
· Update(Entity T)
· Get: GetByID(id),GetByQuery(string sql),GetPage(string sql,int pageSize,int pageIndex...)
· IDataProvider (Insert, Delete, Update,Get)
· SqlDataProvider, OracleDataProvider ,MySqlDataProvider …
ORM的实现
· Entity T BaseDAO<Entity T>.GetByID(int id)
· 生成sql
select * from T.tablename where ID=@id
· 转换成Entity
public class Tclass //entity 实例
{
private int id;
[Column(IsPrimaryKey = true)]
public int Id
{
get { return id; }
set { id = value; }
}
private string name;
[Column(DbType = "nvarchar(max) null")]
public string Name
{
get { return name; }
set { name = value; }
}
}
· 对object进行赋值
string[] propertyNames = BaseHelper.GetPropertyNames(Entity);//属性集
foreach (string str in propertyNames)
{
BaseHelper.SetPropertyValue(obj, row[str]);
}
return (Eentity) obj;
· 通过反射得到属性集
· public static PropertyInfo[] GetProperties(Type myType)
· {
· PropertyInfo[] properties =myType.GetProperties();
· return properties;
· }
补充和说明
· 分页(实现,排序, 效率)
· Update的问题(部分字段和全部 )
· 调用视图,sql,存储过程(集成)
· 反射缓存(属性)
· 数据缓存(提升性 能)
· 事务(回滚)
· Question And Answer