代码之家  ›  专栏  ›  技术社区  ›  stiank81

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

  •  3
  • stiank81  · 技术社区  · 15 年前

    我正在开发一个在客户端使用Silverlight的.NET应用程序。现在,我已经到了要在服务器端抛出静态虚拟数据并添加数据库的地步。

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

    我首先想到的是使用氨气。我对NHibernate一无所知,但我听过很多人热情地提到它。但是我看到ADO.NET也是一个ORM,它内置在框架中。NHiberinate是在吃ADO吗?Linq怎么办?我看到它也被列为ORM,但是我认为Linq更适合查询部分?我可以通过LINQ“定义”数据库吗?

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

    6 回复  |  直到 14 年前
        1
  •  9
  •   Erik Öjebo    15 年前

    NHibernate和Silverlight:

    其中一位NHibernate撰稿人,Ayende Rahien,最近发表了 a blog post 关于nhibernate和Silverlight:

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

    不要尝试。他们相处不好。事实上,他们甚至无法相处。

    Silverlight没有system.data.idb连接,您可以安全地假设它对nhibernate有点重要。

    所以,在Silverlight应用程序中运行nhibernate,大概是为了访问本地数据库,这是不可能的。但我不认为这是大多数人在询问NHibernate和Silverlight时真正想到的。他们想知道服务器上的nhibernate和客户机上的Silverlight。

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

    因此,只要您不打算直接从Silverlight客户端使用它,nhibernate就可以工作。

    NHibernate:

    nhibernate是一个很好的ORM,但是它有一个相当陡的学习曲线,所以如果你选择nhibernate,你应该准备投入一些时间来学习框架。如果你进行投资,你将得到回报的灵活性和力量,NHibernate提供。

    城堡活动记录:

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

    LINQ to SQL:

    linq to sql和ado.net实体框架是包含在.NET框架中的两个orm:s。LinqtoSQL是一个比实体框架更小、更简单的框架,但是它有一些好的特性,并且很容易入门。

    实体框架:

    实体框架也很容易入门,但在当前版本中它有一些相当大的问题,因为它仍然在版本1中。然而,实体框架的下一个版本将改进并修复当前的许多缺点。

    框架的LINQ和模式生成:

    所有这些框架都支持使用LINQ作为查询语言。linq-to-sql和nhibernate可以基于域类和映射为您生成一个模式。实体框架无法在v1中生成架构,但v2将添加该功能。

        3
  •  2
  •   anonymous    15 年前

    对于没有现有数据库的系统,我认为nhibernate+fluenthibernate自动应用值得一试:

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

    我以前没有使用过自动应用程序(我有一个要使用的模式),它们将是我调查的第一个想法。

    第二个选择是ActiveRecord,可能更可靠/更可靠:

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

    同样,也没有使用它,但是我相信您用属性标记实体以指定映射。

    这两种方法的关键是nhibernate可以将映射导出到自动创建表的数据库。

    我也不知道这对Silverlight有何影响。


    在回答评论时(在此处键入比评论更容易):

    nhibernate支持的是获取项目中定义的映射文件并将其导出到数据库的能力。这意味着您只需定义一次模式(应用程序)。

    现在,通常这些映射文件是XML。这不是什么大问题,但显然还有改进的空间。

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

    活动记录的工作原理是允许您将模式定义为实体上的属性,而不是XML。它远不止这些,因为它还实现了ror使用的ActiveRecord模式(entity.save等)。我从来没有用过这个,但它被广泛使用。

    生成NHibernate模式的一个重要方面是单元测试。我可以用几行代码在SQL Lite中创建一个测试数据库,导出模式,填充测试数据,运行测试,然后将其销毁。它使集成测试变得容易,还帮助测试查询是否正常工作。

    我不知道这些是否是最好的解决方案,因为我只使用NHibernate,所以不能对Linq2SQL、EF或其他ORM发表评论。

        4
  •  0
  •   Chris    15 年前

    如果您以前使用过codesmith,并且希望自动生成大量的linq-to-sql代码,那么您可能需要看一下 PLINQO .

    其次,还有一个工具叫做 SubSonic 这也可以创建一个LINQ-to-SQL数据访问层,只需最少的麻烦。

    使用这些工具中的任何一个创建数据访问层都将为您提供可由Silverlight用户界面访问的程序集。

    哦,注意,当plinqo模板和亚音速发生器可以自由使用的时候,codesmith本身就要花钱了。

    祝你的项目好运。

        5
  •  0
  •   Joel Mueller    15 年前

    亚音速已经被提到了,但我向克里斯道歉,我认为值得指出的是,亚音速可以 generate a database 从你的模型课程。因为你特别问过这个功能。

        6
  •  0
  •   Roland Bengtsson    15 年前

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

    例如,OCL中的这个构造表达式:

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

    在这个例子中,有两个类,个人和地址。一个人可以有一个地址,一个地址可以有一个地理点(在这种情况下,这由一个布尔标志表示)和一个街道名。上面的表达式过滤所有人地址中具有地理点的所有街道名称。

    eco中的另一个重要特性是派生属性,它允许您从其他属性计算值(反过来也可以派生)。然后从第一个查询taht缓存该值可以节省CPU时间。ECO也可以从现有数据库中使用。