在.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"
>
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等。
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一般吧?