【问题标题】:ORM and Database ConstraintsORM 和数据库约束
【发布时间】:2010-11-09 13:42:59
【问题描述】:

ORM 与现有数据库之间的兼容性如何?在数据库本身内强制执行了许多约束(特别是唯一键约束/除了主键之外的唯一索引)?

(通常这些是预先存在的数据库,由众多遗留应用程序共享。但良好的数据库建模实践是在数据库中定义尽可能多的约束,作为对应用程序的双重检查。另外请注意,我是数据库引擎不支持延迟约束检查。)

我问的原因是我研究过的 ORM,NHibernate 和 Linq to SQL,在存在数据库唯一约束的情况下似乎不能很好地支撑。例如,删除一行并重新插入具有相同业务键的行会导致外键异常。 (还有一些微妙的、更难避免的例子。)ORM 遵守主键和外键约束,但往往忽略唯一约束。

我了解有一些变通方法,例如 NHibernate 刷新方法。但是,我觉得这是一个非常有漏洞的抽象,并且很难设计应用程序来考虑分离关注点。理想情况下,所有对象都可以通过子程序在内存中进行操作,然后主程序可以负责调用以实际同步数据库。这将隔离更新并允许自定义逻辑在所有更新实际提交到数据库之前检查它们。

以正确的顺序执行命令并非易事。请参阅我的问题here。尽管如此,我期待对流行的 ORM 中的常见情况提供更好的支持。这对于将 ORM 引入现有环境似乎非常重要。

鉴于这些问题,您在使用 ORM 技术方面有哪些经验?

【问题讨论】:

    标签: database nhibernate linq-to-sql orm constraints


    【解决方案1】:

    如果数据库映射正确,好的 ORM 和 NHibernate 就是其中之一,它将强制执行参照完整性和正确的顺序执行。据我所知,它们都不支持检查或唯一约束。检查约束是应该在业务对象中实施的业务规则。我通常只使用检查约束和/或触发器在数据库中强制执行关键的业务规则(即,如果违反这些规则,企业会赔钱和/或我会丢掉工作)。

    唯一约束通常代表一个备用键。对于 ORM,通常的做法是使用代理键(身份)作为主键并对自然键强制执行唯一约束。 ORM 实现唯一约束检查​​将具有挑战性,因为它需要在每次插入或更新之前进行选择和锁定。一般来说,最佳做法是始终在事务中执行操作,如果失败则可以回滚,并向用户提供有意义的错误消息。

    例如,删除一行并重新插入具有相同业务键的行会导致外键异常。

    您是否尝试在单个 ISession 的范围内执行此操作?我可以看出这是有问题的。

    【讨论】:

      【解决方案2】:

      这当然是恕我直言...

      ORM 通常将数据库仅视为数据的存储介质,并且旨在维护“O”端而不是“R”端的约束/业务逻辑。我还没有看到任何 ORM 产品使用了一些更“核心”的关系数据库概念,例如备用键、复合唯一索引和独占子类型。从某种意义上说,ORM 使数据库成为二等公民。

      称我为老式,但 ORM 似乎很适合读取数据,但对于将数据写回非平凡的关系设计,我一直发现它不够用。我更喜欢通过 SQL 和/或存储过程进行所有更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        • 2020-12-10
        相关资源
        最近更新 更多