【问题标题】:Avoiding object identity with NHibernate使用 NHibernate 避免对象标识
【发布时间】:2011-10-29 03:17:57
【问题描述】:

我正在尝试学习 NHibernate,但我偶然发现了一个组合数据库设计/“学习 NHibernate 如何工作”的问题。

就我而言,我正在尝试设计一个包含行和列的简单表格,其中每一行都有一个“描述”,然后有一个“列值”列表(排序),其中也包含数据作为排序信息。在代码中,它看起来像这样:

public class Row
{
    public virtual int ID { get; set; }
    public virtual string Description { get; set; }
    public virtual ICollection<Column> Columns { get; set; }
}

public class Column
{
    public virtual Row ParentRow { get; set; }
    public virtual int SortID { get; set; }
    public virtual string Value { get; set; }
}

我的最终目标是创建一个能够...

  • 两个表,“行”和“列”
  • 行有两列:ID 和描述。
  • 列包含三列:ParentID、SortID 和 Value。

因为一列只能属于一行,并且理想情况下,每一列在每个 ParentID 中都有一个唯一的排序 ID,所以 Column 表的主键可以是 ParentID 和 SortID,而不是有第四个“ID”列。

然而,NHibernate 无时无刻不在与我作对。它坚持我必须有一个 Column 字段的 ID。我想我有几个问题:

  1. 我的“架构目标”本身是否存在严重缺陷?每个 Column 都有自己的 ID 真的是更好的设计吗?如果是,为什么?
  2. 无论我正在寻找的模式是否是一个好的设计,这可以在 NHibernate 中完成吗?到目前为止,我已经成功地映射了“Row”类,但是如果没有 NHibernate 抱怨我必须为其提供 ID,我就无法映射“Column”类。 (对于它的价值,我正在使用 Fluent NHibernate)。我该如何规避呢?

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    ORM 通常可以映射主键和复合主键标识符。从这两个选项中,您应该选择最适合您的用例的选项。

    要了解如何映射复合主键标识符,请阅读 Nhibernate 文档中的 composite-id 部分。

    综上所述,根据经验,我发现非复合主键标识符是您的 ORM 最好的朋友。在许多情况下,它使生活变得更加轻松,例如基于应用程序的 id 生成、批处理等。在类似于“列”表的表中,我更喜欢使用合成主键标识符 (Surrogate key)。但同样,这取决于你的需要,YMMV。

    【讨论】:

      【解决方案2】:

      在 OOP 建模中有两种不同的类型。引用类型和值类型。它们之间的区别在于,对于引用类型,您关心的是 哪些,由一些 Identifier 标识,而对于值类型,您关心的是 什么

      .net 世界中的一个简单示例是

      DateTime d1 = new DateTime(2012,12,21);

      DateTime d2 = new DateTime(2012,12,21);

      现在我们真的关心这两个日期时间是否指向不同的内存实例(它们指向不同的内存实例)

      不,但我们只关心它们是什么,因此它们是平等的。

      您应该首先决定您的实体应该是值类型还是引用类型。如果它是一个引用类型,你应该遵守上面的定义并给 nhibernate 一些标识符。如果你不能给出一个标识符,那么它应该是一个值类型。在那种情况下,你不关心它是哪一个,而是它是什么。对于这种情况,nhibernate 为您提供组件。对于可以存在于同一个表中或单独的组件,无需定义 ID。但是 nhibernate 不会将它们视为一个实体。

      【讨论】:

        猜你喜欢
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 2017-07-11
        • 2017-09-16
        • 2012-05-15
        相关资源
        最近更新 更多