带有类自动生成的.NET ORM解决方案:Subsonic,Castle AR,......?

时间:2010-01-11 16:00:04

标签: .net nhibernate subsonic orm castle-activerecord

我曾经使用过自定义数据映射库,而且我正试图切换到更广泛的ORM解决方案。

经过一些实验,我将我的要求提炼为以下内容:

  • 能够从数据库模式生成可用的类(SQL Server支持就足够了),
  • 支持ActiveRecord模式,
  • programmaticaly可配置(通过代码或属性,无HBM文件),
  • 自由。

你能推荐一个吗?


到目前为止,我已经尝试过:

亚音速3.0

我最喜欢的那个,因为它感觉就像功能和简单之间的良好平衡。

我不喜欢的事情:

  • 使用IQueryable<>和一对多关系两端的复数名称 - 这对我来说似乎是违反直觉的;
  • 为所有类生成一个文件 - 比如每个类一千行,我对代码文件那么大感觉不好;
  • 自动调用T4处理,因此必须始终提供具有最新架构的数据库

Castle ActiveRecord

带有ActiveWriter加载项的CastleAR几乎就是我所需要的,但ActiveWriter的代码并不完美(似乎不支持Nullable<>属性,默认的一对多实现不起作用)和我无法找到如何手动修复此代码。

Darkside GeneratorStudio产生更好的代码 - 正确的定义,每个实体一个文件 - 尽管它使用隐藏的名称,如 RefclassIdRefclass 。我个人喜欢Studio addin而不是独立应用程序,但这肯定是一个小问题。

CastleAR发行版中捆绑了大约20个文件;虽然本身不​​是问题,但感觉就像超重。我不需要太多关于NHibernate和其他东西的深奥知识吗?

流利的NHibernate

广泛推荐,但我无法找到它的代码生成器。

我错过了重要的事情吗?

6 个答案:

答案 0 :(得分:3)

NHibernate不遵循活动记录模式,它遵循存储库模式。

FluentNHibernate的目标是需要维护映射文件,代码生成等。它支持Fluently定义的NH#文件的NH#文件,它非常好,比XML更易于维护,但它的自动映射功能更强大。如果您的数据库是使用强定义的约定设计的,则可以配置FNH,它将正确地生成所有域对象到数据库结构的正确映射。

如果你对设计数据库更感兴趣并且决定你的域名模型(这会让我觉得非常肮脏),那么这里有一个问题专门讨论NHibernate Generators

回答你的评论: NHibernate本身不会改变数据库本身,但是有一个名为SchemaExport的实用程序类,它提供了一个名为Create的工厂方法。您可以使用它来生成以NHibernate查看关系结构的方式创建数据库所需的SQL语句。并且可以选择直接针对数据库运行或写入控制台。

此实用程序对于将域正向生成到数据库非常有用,它目前是我为所有新应用程序开发编写数据库的方式。我仍在努力找出维护数据库版本的最佳方法。最糟糕的情况是SC只是SC输出,并且需要对每一行更改模式的注释,以使其具有特定的更新/删除语句来实现结果。这样可以很容易地按版本前滚/后退,或者只是执行整个脚本从头开始创建数据库。

如果你纯粹是为了反向映射,应该有可用的工具来生成数据库需要映射到等效类的相应HBM(即如果你原本在域模型中编写这些类,它将导出匹配的模式您当前的数据库)

答案 1 :(得分:2)

  
      
  • 能够从数据库模式生成可用的类(SQL Server支持是   足够),
  •   
  • 支持ActiveRecord模式,
  •   
  • programmaticaly可配置(通过代码或属性,没有HBM文件),   免费。
  •   
  1. Linq-to-SQL从数据库架构自动生成。一个大问题是属性名称是小写的,因此您需要像this one这样的工具来重命名它们。 It isn't restricted to SQL Server

  2. It sort of supports the ActiveRecord pattern - 非常接近。

  3. 这些类可以通过dbml文件进行配置,该文件只是一个XML文件。 Visual Studio生成一个designer.cs文件,允许您在生成为partial类时生成的实体添加。

  4. 除了NH和亚力克之外,其他一些人还要看看:

    • Lightspeed - 对于8个以下的实体免费,该链接显示了一些示例代码。您必须通过接口定义从表到类的映射,因此它不符合1)
    • LLBlgen - 它不是免费的

答案 2 :(得分:1)

关于你不喜欢SubSonic的一些想法:

  • 使用IQueryable<>和一对多关系两端的复数名称 - 似乎 对我来说反直觉;

是的,我同意这是非常反直觉的,我从来没有深究其中的原因,但你可以很容易地修改模板来解决这个问题。

  • 为所有类生成一个文件 - 比如每个类一千行,我对代码文件那么大感觉不好;

您认为这可能会导致问题,但我还没有遇到任何问题,而且我还没有看到有关stackoverflow的报告。

  • 自动调用T4处理,因此必须始终提供具有最新架构的数据库。

只有在您编辑t4文件时才会自动调用它,所以当您对模板进行更改时,实际上只需要一个最新的模式。

答案 3 :(得分:1)

我们使用CodeSmith进行代码生成,并强烈推荐它作为生成工具。

如果您查看CodeSmith,它支持各种ORM /业务对象模板。

我们几年前实施了自己的CSLA(参见http://www.lhotka.net/)模板来掌握CSLA,而不仅仅是ORM。 CSLA很棒,效果很好,而且具有很高的可扩展性。我们现在已经创建了自己的框架并删除了核心CSLA框架,因为我们不需要所有功能并且使事情变得更轻便。

答案 4 :(得分:0)

我想知道旧的SubSonic 2.2是否更适合您的要求?它确实为每个表生成单独的类,只在您告诉它时重新生成,并支持ActiveRecord模式。请参阅http://subsonicproject.com/docs/Main_Page

文档中的更多详细信息

答案 5 :(得分:0)

关于以前的帖子CSLA不是ORM(您可以手动执行从数据库到Business Objects的映射)。 CSLA,NHibernate,亚音速等不支持活动记录模式。

如果您正在考虑不支持Active Records模式的Frameworks,那么我会考虑Habanero(http://www.habanerolabs.com/)这是开源的,并允许您通过XML配置或通过代码构建Business Objects。 Habanero不仅仅是一个ORM,还具有丰富的域(业务对象)支持,并具有强大的对象模型,用于表示您的域对象(Business Objects)。