天天看點

.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等。

原文位址: http://www.cnblogs.com/Terrylee/archive/2006/12/02/ope ... resource_recommendation_orm.html