为.NET项目选择数据库和ORM

时间:2009-08-06 13:43:20

标签: .net database linq nhibernate orm

我正在使用Silverlight在客户端上运行.NET应用程序。现在我已经到了我想在服务器端抛出静态虚拟数据并添加数据库的地步。

对于数据库,我喜欢使用其中一个ORM,我可以简单地标记我的模型类,并为我构建数据库表。我之前用Groovy和Grails做了一些测试,并认为GORM做得很顺利。在.Net中设置数据库的最佳方法是什么?

让我印象深刻的第一件事就是使用nHibernate。我对nHibernate一无所知,但我听到很多人热情地提到它。但后来我发现ADO .Net也是一个内置于框架中的ORM .. nHibernate是否超越了ADO?和LINQ有什么关系?我看到它也被列为ORM,但我认为LINQ更适用于查询部分?我可以通过LINQ“定义”数据库吗?

欢迎提出任何意见和建议。如果您对要使用的数据库有什么意见,我也很想听听。我假设MS SQL Server是最简单的选择?

6 个答案:

答案 0 :(得分:9)

NHibernate和Silverlight:

其中一位NHibernate贡献者Ayende Rahien最近发布了关于NHibernate和Silverlight的a blog post

  

我有一些关于NHibernate和Silverlight的问题。这实际上是一个很容易回答的问题。

     

甚至不要尝试。他们不相处。事实上,他们甚至都不会相处。

     

Silverlight没有System.Data.IDbConnection,你可以放心地认为这对NHibernate来说有点重要。

     

因此,在Silverlight应用程序中运行NHibernate,可能是为了访问本地数据库。但我不认为这是大多数人在询问NHibernate和Silverlight时的实际想法。他们想知道服务器上的NHibernate和客户端上的Silverlight。

     

这也很容易回答,它可以像任何客户端/服务器系统一样工作。所有相同的规则都适用。

因此,只要您不打算直接从Silverlight客户端使用它,NHibernate就应该工作。

<强> NHibernate的:

NHibernate是一个很棒的ORM,但它有一个非常陡峭的学习曲线,所以如果你选择NHibernate,你应该准备花一些时间来学习框架。如果您进行投资,您将获得NHibernate提供的灵活性和强大功能。

Castle ActiveRecord:

Castle ActiveRecord是一个构建在NHibernate之上的框架,因此与NHibernate非常相似。它稍微减少了学习曲线,因为它增加了一些额外的抽象。顾名思义,它是与ActiveRecord模式一起使用的构建,并且包含一个基类,如果您不介意使用它们的ActiveRecord基类,它将为您提供相当多的功能。

LINQ to SQL:

LINQ to SQL和ADO.NET实体框架是.NET Framework中包含的两个ORM。 LINQ to SQL是一个比Entity Framework更小更简单的框架,但它有一些很好的功能,并且很容易上手。

实体框架:

实体框架也很容易上手,但它在当前版本中有一些相当大的问题,因为它仍然在版本1.但是,下一版本的实体框架将改进和修复许多目前的缺点。

框架的LINQ和架构生成:

所有这些框架都支持使用LINQ作为查询语言。 LINQ to SQL和NHibernate可以根据您的域类和映射为您生成架构。实体框架无法在v1中生成架构,但v2将添加该功能。

答案 1 :(得分:2)

答案 2 :(得分:2)

对于没有现有数据库的系统,我认为NHibernate + FluentNHibernate自动化是值得一试的:

http://wiki.fluentnhibernate.org/show/AutoMapping

之前我没有使用过自动化(我给出了一个架构可供使用),这是我第一个想要调查的想法。

第二种选择,可能更可靠/证明是ActiveRecord:

http://www.castleproject.org/activerecord/index.html

同样,也没有使用过这个,但我相信你用属性标记你的实体来指定映射。

两者的关键是NHibernate可以将映射导出到数据库,自动创建表。

我也不知道这会如何影响Silverlight。


回答评论(这里比评论更容易输入):

NHibernate支持的是能够获取项目中定义的映射文件并将其导出到数据库。这意味着您可以定义一次架构(您的应用程序)。

现在,通常那些映射文件是xml。这不是什么大问题,但显然还有改进的余地。

FluentNHibernate允许您(a)在代码中定义映射文件或(b)通过约定自动创建实体的映射文件。我使用方法(a)因为我的数据库很糟糕,并且在这个世界上没有它的惯例,但是为了你的使用我建议(b)自动化。上面的wiki链接提供了一个快速示例,说明它如何映射产品和货架。

Active Record的工作原理是让您定义不在XML中的架构,而在实体上定义属性。它远不止于此,因为它还实现了RoR使用的ActiveRecord模式(Entity.Save等)。我从未使用过它,但它被广泛使用。

关于NHibernate模式生成的一个好处是单元测试。我可以在几行代码中在SQL Lite中创建一个测试数据库,导出模式,填充测试数据,运行测试,然后将其拆除。它使集成测试变得简单,并且还有助于测试查询是否正常工作。

我不知道这些是否是最佳解决方案,因为我实际上只使用NHibernate,因此无法对Linq2SQL或EF或其他ORM发表评论。

答案 3 :(得分:0)

如果您之前使用过CodeSmith并且想要自动生成大量LINQ to SQL代码,那么您可能需要查看PLINQO

其次,还有一个名为SubSonic的工具,它也可以创建一个LINQ to SQL数据访问层,而且遇到的麻烦最小。

使用这些工具之一创建数据访问层应该为您提供Silverlight用户界面可以访问的程序集。

哦注意,CodeSmith本身确实需要花钱,而PLINQO模板和SubSonic生成器可以免费使用。

祝你的项目好运。

答案 4 :(得分:0)

SubSonic已被提及,但对Chris表示道歉,我认为值得指出的是,SubSonic可以为您提供模型类generate a database。由于您特别询问了该功能。

答案 5 :(得分:0)

我绝对会使用ECO。它最多可免费提供12个课程,并提供许多有用的功能。它以模型为中心,并使用OCL在模型中导航。在我看来,OCL比SQL或LINQ更容易使用。

例如在OCL中构造的表达式:

Person.allinstances.address->select(hasGeoPoint).streetname

在此示例中,有2个类,Person和Address。一个人可以有一个地址,一个地址可以有一个geoPoint(在这种情况下,这是由一个布尔标志表示)和一个街道名称。上面的表达式过滤了所有人员地址中具有地理位置的所有街道名称。

ECO中的另一个重要特性是派生属性,可以让您从其他属性计算值(这些属性又可以派生)。然后从第一个查询缓存该值,从而节省CPU时间。 ECO也可以在现有数据库中使用。