【问题标题】:Is there an ORM tool for C# that can 'black box' the database?是否有用于 C# 的 ORM 工具可以“黑盒”数据库?
【发布时间】:2009-10-01 21:33:02
【问题描述】:

我创建了一堆 POCO,我想为其创建一个持久层。问题是,我真的不在乎数据是如何存储在 SQL Server 中的,我只想存储它。换句话说,我想告诉 ORM 工具,“这里有一些 POCO 类,保存它们。”并且不必做除此之外的任何事情。是否有任何 C# 的 ORM 工具可以做到这一点?我一直在努力让 Fluent NHibernate 正常工作,而 Subsonic 不支持关系,这使得“为一个帖子获取所有 cmets”之类的事情变得非常困难。它需要能够自动生成数据库模式,而无需我设置一堆属性等等。

【问题讨论】:

  • 如果数据库中存在外键关系,Subsonic 确实支持关系。它应该像迭代 Post.Comments... 一样简单
  • 是的,如果您使用 ActiveRecord 并自下而上。但是,我正在使用 SimpleRepository 进行自上而下的操作,到目前为止它还不支持关系。
  • 当报告组想要在六个月后查询自动生成的架构时,往往会出现问题。我个人会设计我的类,设计我的表和关系(可能在 DBA 的帮助下),然后映射它们。
  • 就我而言,没有 DBA、报告组、质量保证或其他任何东西。只有我,IDE,以及迫在眉睫的最后期限:)。

标签: c# orm poco


【解决方案1】:

您可以尝试DataObjects.Net,但这并不是您想要的。首先,它的实体不是 poco,您必须从某些基本类型继承它们。其次,您应该使用特殊属性标记要保存的字段。

那我为什么推荐 DataObjects 呢?因为我认为它完全是黑盒数据库。您只需制作一堆对象并要求 ORM 保存它们。

  • 它在运行时自动在指定的RDBMS中生成数据库模式。
  • 您不必调用 .Save() 之类的方法来保存更改,只需像处理普通对象一样工作。
  • 您不必编写 SQL 查询 - 它完全支持 LINQ。
  • 即使将现有数据库升级到下一个版本,您也不必处理 SQL 脚本。

【讨论】:

    【解决方案2】:

    我个人使用 Fluent NHibernate,它可以满足我的需求。嗯,差不多。有些事情需要手动指定 ManyToMany,但您无法避免。如果你想要好的实体设计,你必须将一些成员设为私有,这会禁用这些成员的自动映射。尽管如此,我还是改变了我的设计,甚至从未想过我的数据库是如何改变的(一个新项目的奢侈,但是......)。

    你看过 Castle ActiveRecord 吗?您真的需要真正的 POCO,还是可以使用属性和 .Save 实体?好吧,我会避免这样做,但它可能对你有用。

    【讨论】:

    • 我在使用 Fluent NHibernate 使用自动映射时遇到的两个问题是:1. 当我尝试使用 Dictionary 列时它会出错,2. 它不映射枚举,我有很多.第一个问题是可以理解的(我应该将键/值对包装在一个类中),但我找不到第二个问题的解决方案。
    • 我使用枚举没有问题。我对此有疑问,但谷歌提供了简单的解决方案。这里有很多关于这个的问题,而且很容易解决。现在不能确切地说,但据我记得我刚刚添加了 IPropertyConvention,它告诉使用 GenericEnumMapper 进行枚举,请参阅stackoverflow.com/questions/439003/…,尽管您可能想要使用 CustomTypeIs(typeof(int))。无论如何,这不是 FNH 最大的问题 ;-)
    • 事实证明,Fluent NHibernate 1.0 RTM 可以很好地自动映射枚举(尽管是字符串),但不能收集枚举。目前正在研究这是否可能。
    • 看这里:mail-archive.com/fluent-nhibernate@googlegroups.com/…。你可能需要 .AsElement()。
    【解决方案3】:

    查看Subsonics SimpleRepository。创建一个类,创建一个数据库,给 Subsonic 一个连接字符串,它会处理其余的。漂亮。

    【讨论】:

    • SimpleRepository 不支持关系生成。如果您有不需要关系的单个对象(例如单个博客文章),那很好,但是在需要关系的情况下(例如属于特定帖子的 cmets)您会怎么做?
    【解决方案4】:

    如果你不关心它是如何存储的,为什么还要使用 SQL Server? couchDB怎么样http://couchdb.apache.org/docs/intro.html

    【讨论】:

    • 因为SQL Server是我们公司和客户使用的。
    【解决方案5】:

    看看 DevExpress 的eXpress Persistent Objects

    【讨论】:

    • 我看了一下,但是因为你必须从XPObject继承,所以它把POCO对象变成了持久感知对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多