现在的位置: 首页 > 综合 > 正文

浅谈.NET中ORM的设计和实现

2012年11月13日 ⁄ 综合 ⁄ 共 2175字 ⁄ 字号 评论关闭

 

Tech  Share Club 
 

浅谈.NETORM的设计和实现

  

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

 

抱歉!评论已关闭.