友情链接: 互动百科 CSDN.NET 百度音乐 和讯理财 世界杯吧 拉手网

.Net下各种ORM框架介紹

在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做扼要的介绍并推荐一些学习的资源:

1.NHibernate

2.NBear

3.Castle ActiveRecord

4.iBATIS.NET

5.DAAB

附加介绍:DLinq



一.NHibernate

提起NHibernate,相信大家都不目生,NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具,它从数据库底层来持久化.Net对象到关系型数据库,NHibernate为我们完成这一切,而不用自己写SQL语句去操纵数据库对象,所写的代码仅仅和对象联系关系,NHibernat自动产生SQL语句,并确保对象提交到准确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理数据的时间. NHibernate可以匡助消除或者包装那些针对特定数据库的SQL代码,并且把结果集从表格的表示形式转换到一系列的对象去。NHibernate采用XML文件配置的方式,每一个实体类都会对应一个映射文件,如下面的例子:

public class User
{
     public User()

     {

     }

     private string id;

     private string userName;

     private string password;

     private string emailAddress;

private DateTime lastLogon;

     public string Id

     {
         get { return id; }

         set { id = value; }
     }

     public string UserName

     {
         get { return userName; }

         set { userName = value; }
     }

     public string Password

     {
         get { return password; }

         set { password = value; }
     }

     public string EmailAddress

     {
         get { return emailAddress; }

         set { emailAddress = value; }
     }

     public DateTime LastLogon

     {
         get { return lastLogon; }

         set { lastLogon = value; }
     }
}
它对应的.hbm.xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

   <class name="NHibernateWebDemo.Model.User, NHibernateWebDemo.Model" table="users">

     <id name="Id" column="LogonId" type="String" length="20">

       <generator class="assigned" />

     </id>

     <property name="UserName" column= "Name" type="String" length="40"/>

     <property name="Password" type="String" length="20"/>

     <property name="EmailAddress" type="String" length="40"/>

     <property name="LastLogon" type="DateTime"/>

   </class>

</hibernate-mapping>

官方主页:http://www.nhibernate.org/

学习资源

园子里首推DDL的Blog:http://www.cnblogs.com/renrenqq/,有NHibernate文档的中文翻译以及DLL写的一些非常优秀的NHibernate文章。

大名鼎鼎的张老三:http://blog.csdn.net/billy_zh/category/22383.aspx

Aero的Nhibernate学习手记系列:http://www.cnblogs.com/chwkai/category/32514.html

无心之柳的Blog也非常值得推荐:http://www.cnblogs.com/9527/

博客园O/R Mapping团队:http://www.cnblogs.com/team/ORMapping.html



二.NBear

园子里Teddy开发的NBear大家都非常认识,现在已经发布了3.0正式版。NBear包含的组件不仅仅是数据持久层,还包含了IOC,分布式组件和Web组件。看一下Teddy对于NBear的介绍:

NBear的核心包括一个泛型、强类型的的ORM数据持久化接口、一组相关的Entity相关组件、高机能分布式组件、Web组件,因此:

1、NBear最适合开发各类基于ASP.NET 2.0,对机能要求较高的Web程序。NBear.Web组件提供了很多加速Web开发的组件,将使您基于尺度 ASP.NET方式的开发效率大大进步;同时,简朴易用、机能凸起的泛型持久化支持,则将使您能够将更多留意力集中到业务开发,同时也不会有传统ORM持久化框架的机能题目和繁琐配置需要(NBear几乎不需手动配置,机能则接近DAAB)。

2、基于MQ和.Net Remoting的高机能分布式组件,将使您开发和维护分布式程序更加轻易。一个基于NBear.IoC模块的开发的应用程序甚至无需重新编译就能部属为真正的负载均衡的分布式程序。

3、对于桌面应用程序,NBear同样是一个几乎没有什么学习曲线(多少人会为写一个小小的日历程序而仔细研究透彻Hibernate的参考手册?)、实用高效的数据持久化方案。

4、跟着NBearV3带来的全面的ORM支持、更具体的文档和教程,和全面的代码天生工具,NBear也已经可以被用于企业级程序开发。

官方首页:http://teddyma.cnblogs.com/articles/Ilungasoft_Framework.html

学习资源

学习资源当然首推Teddy的个人Blog:http://www.cnblogs.com/teddyma/

博客园NB团队:http://nbteam.cnblogs.com/



三.Castle ActiveRecord

ActiveRecord是Castle中的一个子项目,现在的版本是RC1。它同样是一个非常优秀的持久层框架,在底层封装了NHibernate,改用Attribute来代替配置文件,这样就不用再像NHibernate那样去编写复杂的配置文件。如下代码片段所示:

[ActiveRecord("Users")]
public class User : ActiveRecordBase

{
     private int _id;

     private string _name;

     private string _password;

     private string _emailAddress;

     private DateTime _lastLogon;

     [PrimaryKey(PrimaryKeyType.Identity, "LogonID")]

     public int Id

     {
         get { return _id; }

         set { _id = value; }
     }

     [Property("LogonName")]

     public string Name

     {
         get { return _name; }

         set { _name = value; }
     }

     [Property("Password")]

     public string Password

     {
         get { return _password; }

         set { _password = value; }
     }

     [Property("EmailAddress")]

     public string Address

     {
         get { return _emailAddress; }

         set { _emailAddress = value; }
     }

     [Property("LastLogon")]

     public DateTime LastLogon

     {
         get { return _lastLogon; }

         set { _lastLogon = value; }
     }

}

官方主页:http://www.castleproject.org

学习资源

官方文档:http://www.castleproject.org/activerec ... tation/v1rc1/index.html

叶子的家:http://wj.cnblogs.com/

TerryLee的Castle开发系列:

http://terrylee.cnblogs.com/archiv ... astl_ioc_article.html

Castle项目成员之一ayende的Blog:http://www.ayende.com/Blog/



四.iBATIS.NET

iBATIS.NET分为DataMapper和DataAccess两部门,应该说DataMapper是这个框架的核心,DataMapper使用 XML文件来实现从实体到SQL statements的映射,学习起来非常简朴,是用DataMapper后,我们可以自由的使用SQL语句或者存储过程;DataAccess答应我们通过一个简朴的接口来操纵数据,而不必了解底层实现的细节。如下代码片段:
[Serializable]

public class Person

{
     private int id;

     private string firstName;

     private string lastName;

     private DateTime? birthDate;

     private double? weightInKilograms;

     private double? heightInMeters;

     public Person() { }

     public int Id

     {
         get { return id; }

         set { id = value; }
     }

     public string FirstName

     {
         get { return firstName; }

         set { firstName = value; }
     }

     public string LastName

     {
         get { return lastName; }

         set { lastName = value; }
     }

     public DateTime? BirthDate

     {
         get { return birthDate; }

         set { birthDate = value; }
     }

     public double? WeightInKilograms

     {
         get { return weightInKilograms; }

         set { weightInKilograms = value; }
     }

     public double? HeightInMeters

     {
         get { return heightInMeters; }

         set { heightInMeters = value; }
     }
}

映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>

<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

   <alias>

     <typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />

   </alias>

   <resultMaps>

     <resultMap id="SelectAllResult" class="Person">

       <result property="Id" column="PER_ID" />

       <result property="FirstName" column="PER_FIRST_NAME" />

       <result property="LastName" column="PER_LAST_NAME" />

       <result property="BirthDate" column="PER_BIRTH_DATE" />

       <result property="WeightInKilograms" column="PER_WEIGHT_KG" />

       <result property="HeightInMeters" column="PER_HEIGHT_M" />

     </resultMap>

   </resultMaps>

   <statements>

     <select id="SelectAllPerson" resultMap="SelectAllResult">

       select

       PER_ID,

       PER_FIRST_NAME,

       PER_LAST_NAME,

       PER_BIRTH_DATE,

       PER_WEIGHT_KG,

       PER_HEIGHT_M

       from PERSON

     </select>

     <select id="SelectByPersonId" resultClass="Person" parameterClass="int">

       select

       PER_ID,

       PER_FIRST_NAME,

       PER_LAST_NAME,

       PER_BIRTH_DATE,

       PER_WEIGHT_KG,

       PER_HEIGHT_M

       from PERSON

       where PER_ID = #value#

     </select>

     <insert id="InsertPerson"   parameterclass="Person" >

       <selectKey property="Id" type="post" resultClass="int">

         ${selectKey}

       </selectKey>

       insert into Person

       ( PER_FIRST_NAME,

       PER_LAST_NAME,

       PER_BIRTH_DATE,

       PER_WEIGHT_KG,

       PER_HEIGHT_M)

       values

       (#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)

     </insert>

     <update id="UpdatePerson" parameterclass="Person">

       <![CDATA[ update Person set

       PER_FIRST_NAME =#FirstName#,

       PER_LAST_NAME =#LastName#,

       PER_BIRTH_DATE =#BirthDate#,

       PER_WEIGHT_KG=#WeightInKilograms#,

       PER_HEIGHT_M=#HeightInMeters#

       where

       PER_ID = #Id# ]]>

     </update>

     <delete id="DeletePerson" parameterclass="Person">

       delete from Person

       where

       PER_ID = #Id#

     </delete>

   </statements>

</sqlMap>
官方主页:http://ibatis.apache.org/



学习资源

官方文档:

http://opensource.atlassian.com/confluen ... IBATIS/Quick+Start+Guide

善友的iBATIS.NET开发指南系列:

http://www.cnblogs.com/shanyou/archive/2006/04/29/388610.html


五.DAAB

DAAB是微软Enterprise Library中的一个应用程序块,能够匡助我们实现通用的数据访问,所以也把它列在这里介绍一下。DAAB使应用程序中的数据访问在不知道详细的数据库系统的情况下进行,相信良多朋友对DAAB都很熟性并且已经在项目中使用,就未几介绍了,看一个简朴的代码片段:
public string GetCustomerList()

{
// 创建Database对象

Database db = DatabaseFactory.CreateDatabase();

// 使用SQL语句创建DbCommand对象

string sqlCommand = "Select CustomerID, Name, Address, City, Country, PostalCode " +

     "From Customers";

DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);

StringBuilder readerData = new StringBuilder();

// 调用ExecuteReader方法

using (IDataReader dataReader = db.ExecuteReader(dbCommand))

{

     while (dataReader.Read())

     {

         // Get the value of the 'Name' column in the DataReader

         readerData.Append(dataReader["Name"]);

         readerData.Append(Environment.NewLine);

     }

}

return readerData.ToString();

}

官方主页:http://msdn.microsoft.com/practices/

学习资源

企业的匡助文档和Hands On Lab

TerryLee的Enterprise Library系列:http://www.cnblogs.com/Terrylee/archi ... nterprise_Library.html



附加介绍:DLinq

DLinq固然不能算是开源框架,但是说到数据持久,仍是提一下比较好,DLinq是微软下一代数据库集成查询语言,在这之前微软曾经尝试过 ObjectSpace,最后是不了了之。DLinq实现的方式有点类似于前面说过的ActiveRecord,不支持使用外部的XML配置文件,而是使用了Attribute的方式,如下代码片段所示:
[Table(Name="Customers")]

public class Customer

{

     [Column(Id=true)]

     public string CustomerID;

     [Column]

     public string City;

}

官方主页:http://msdn.microsoft.com/netframework/future/linq/

学习资源

下载LINQ May CTP版:http://msdn.microsoft.com/data/ref/linq/

ScottGu的Blog:http://weblogs.asp.net/scottgu/default.aspx


最后值得一提的是,微软又推出个Ado.net vNext,使用映射文件来配置,更加类似于NHibernate。关于持久层框架,还有良多,这里就不再介绍了,如Grove等。
posted on 2011-01-14 10:46  行万里路 责任 创新 执着  阅读(746)  评论(0编辑  收藏  举报