在.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/activerecord/documentation/v1rc1/index.html
葉子的家:http://wj.cnblogs.com/
TerryLee的Castle開發系列:
http://terrylee.cnblogs.com/archive/2006/04/28/castl_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/confluence/oss/display/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/archive/2006/08/01/Enterprise_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等。
<script type="text/javascript"> // </script>
Feedback
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 00:57 by overred 總結不錯哦。。。
晚安
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 01:02 by Tseng 被搶了沙發,5555
我一直在等待NH1.2的正式版本出來.
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 01:11 by Tseng[匿名] 如果在一個項目中應用上面的幾個架構,哪幾個結合比較好?NHibernate+iBATIS.NET?或者是單一使用?
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 02:00 by neuhawk 基于linq的orm肯定不錯的,因為linq很強大.
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 08:40 by exhjw 還有 Gentle.Net
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 08:58 by .progame 現在釋出的dlinq除了不支援多資料庫外,簡直帥到掉渣
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 09:41 by 音樂蟲子 這麼多架構,真的有點無所适從!
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:45 by 劍在上海^^ 把NH堅持到底.................- - |||
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:45 by TerryLee @overred
謝謝,現在剛起來
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:46 by Dflying Chen 這種文章絕對是精華!不過有個疑惑,為什麼你的文章中的代碼兩行之間都要空一行呢?這樣文章太長了,看起來不友善啊
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:46 by TerryLee @Tseng
NH還是比較靈活的,就是編寫映射檔案有點複雜:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:47 by TerryLee @Tseng[匿名]
我現在一般選用的是Castle中的AR
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:47 by Dflying Chen 我是用Firefox 1.5的
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:49 by TerryLee @neuhawk
不過DLinq也有一點問題的,有人曾經總結過幾點意見,總體來說還是比較優秀的:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:50 by TerryLee @exhjw
謝謝推薦:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:51 by TerryLee @.progame
現在還沒有在實踐中體驗過,希望有機會體驗一把:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:53 by TerryLee @音樂蟲子
有時候選擇使用哪種架構也是個問題-_-
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:54 by TerryLee @劍在上海^^
NH的忠實使用者,呵呵
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:55 by TerryLee @Dflying Chen
謝謝指出,直接從Word中拷貝過來的,然後再插入代碼,不知道為什麼就出現了這個問題,可能是我在Word中設定了行距了吧,下次注意一下:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:56 by Dflying Chen @TerryLee
我覺得是“插入代碼”功能的問題。你檢視一下頁面的CSS吧
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 10:58 by TerryLee @Dflying Chen
可能是我在粘貼到“插入代碼”的文本框中的時候,就已經有空行了,我修改一下,呵呵
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:05 by Dflying Chen @TerryLee
希望你的文章樣式和文章内容一樣專業!
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:07 by TerryLee @Dflying Chen
呵呵,調過來,現在看一下還有沒有這個問題:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:07 by 木野狐 收藏了。
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:23 by Dflying Chen @TerryLee
不錯不錯,現在好了!
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:31 by TerryLee @木野狐
:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:32 by TerryLee @Dflying Chen
下次得注意了,呵呵
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:42 by Tseng @劍在上海^^
對,将NH支援到底,而CASTLE不竟是封裝了NH.
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 11:51 by TerryLee @Tseng
小項目中使用AR還是挺友善的,畢竟NH多了映射檔案:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 13:39 by 張豪[匿名] 今天想潑點冷水,希望大哥不要生氣: 天天在部落格園上泡着,這樣的文章其實大哥已經寫了幾次了 ,都是初級的 對初學者沒有太多的實用價值 希望樓主能夠多寫一些帶有整體執行個體的文章,從前台到背景,很清晰 這樣初學這才知道這是怎麼使用,要不都是斷斷續續,很難去把握整體。不好意思希望不要介意
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 15:42 by TerryLee @張豪[匿名]
“這樣的文章其實大哥已經寫了幾次了”
===============================================
呵呵,如果我沒有記錯的話,這好像是我第一次寫這樣的文章吧?對于初學者來說,往往不知道該學什麼?或者說要實作一些功能有哪些架構可以使用?學習這些架構有什麼好的資源?本系列文章的作用在于此!
個人能力和精力有限,不可能對一直有時間去針對這些架構寫一些帶有整體執行個體的文章,是以還請見諒,畢竟大家都是利用業餘時間在寫
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 17:28 by Amnoh 建議樓主,把漢字的斜體去掉,漢字最好加粗或者下劃線,斜體會把字弄得看不清
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 19:32 by overred 看ScottGu寫的Using LINQ with ASP.NET 系列還行
http://weblogs.asp.net/scottgu/archive/2006/05/14/Using-LINQ-with-ASP.NET-_2800_Part-1_2900_.aspx
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-02 21:43 by 蛙蛙池塘 有用,總結的不錯,謝謝。
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 01:10 by seraph[匿名] 在園子裡看了不少介紹這種資料持久層架構的介紹
但是個人有個疑問就是大家在真正的項目中到底用到了哪些呢?
還是隻是學習學習?
真正用到這些架構的時候程式員又會覺得很無聊學不到東西,為什麼?因為模式已經固定,剩下的就是簡單的生成代碼,複制
應該讓每個程式員都非常清晰的明白整個業務的流程(我碰到過許多程式員和需求分析吵架的場面),否則大家不知道自己寫代碼能學到什麼,相信一個熟知某個業務流程的程式員才是企業真正需要的人才吧
--唉喲,文字表達能力不行,亂說一氣,大家别拍我
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 01:19 by seraph[匿名] 嗯,再羅嗦一句
這麼多介紹資料持久層的文章
希望園子裡能多點關于具體使用某個持久層進行開發時碰到的問題,而不是一些簡單的業務邏輯示範
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 01:19 by seraph[匿名] 嗯,再羅嗦一句
這麼多介紹資料持久層的文章
希望園子裡能多點關于具體使用某個持久層進行開發時碰到的問題,而不是一些簡單的業務邏輯示範
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 11:12 by 風雲 :)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 14:42 by TerryLee @Amnoh
好,我下次注意一下
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 14:43 by TerryLee @overred
ScottGu的文章都很不錯,呵呵:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 14:43 by TerryLee @蛙蛙池塘
:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 14:54 by TerryLee @seraph[匿名]
1.在園子裡看了不少介紹這種資料持久層架構的介紹
==========================================
我就奇怪,園子裡有這樣對開源架構分類進行介紹和總結,并推薦學習資源的文章嗎?
2.但是個人有個疑問就是大家在真正的項目中到底用到了哪些呢?
還是隻是學習學習?
===========================================
并不是說項目中用了哪些,以上所介紹架構都有人在項目中使用,我個人也在項目中使用過AR,并不隻是學習學習!
3.真正用到這些架構的時候程式員又會覺得很無聊學不到東西,為什麼?因為模式已經固定,剩下的就是簡單的生成代碼,複制
============================================
這隻是你個人遇到的情況而已,并不代表所有!
4.應該讓每個程式員都非常清晰的明白整個業務的流程(我碰到過許多程式員和需求分析吵架的場面),
==============================================
這個問題不是在園子裡寫一兩篇文章就能解決的!
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 15:53 by 丁丁 .NetTier + CodeSmith算不算也是一種資料持久層的方案?那麼多方案,到底哪個好呢?請不要回答微軟的好,雖然估計大家早晚都會使用微軟的方案。
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 19:51 by Allen Zhang 介紹得很好,隻是,像我這種以前從沒用過這些東西的人來說,不知道要選哪個好。。能不能推薦一下呢,什麼樣的情況下要用什麼?
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 23:34 by TerryLee @丁丁
這個算是一種解決方案吧,這裡讨論的是開源資料持久層架構
也不能說是哪個好,哪個壞,各有優劣吧。比如說NH雖然配置繁瑣,但是它靈活;AR配置簡單,但它不如NH那麼靈活。
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-03 23:37 by TerryLee @Allen Zhang
在架構的選用上,NBear不錯,就是版本更新的太快:),我個人在項目中使用AR,感覺不錯:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 08:16 by Tseng @TerryLee
同感,每天上來這裡,都可以看到新的一個版本出現,真是可怕。
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 08:24 by TerryLee @Tseng
是啊:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 13:14 by Kevin Wu 嗯嗯,這個東西好呀,多謝李大哥分享
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 18:43 by TerryLee @Kevin Wu
:)
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 22:05 by jay[匿名] Gentle.net和subsonic都不錯
# re: .NET開源項目介紹及資源推薦:資料持久層 回複 更多評論
2006-12-04 23:39 by TerryLee @jay[匿名]
Gentle.NET還是不錯的,subsonic一般吧?