使用NHibernate避免对象标识

时间:2011-10-29 03:17:57

标签: c# nhibernate

我正在尝试学习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; }
}

我的最终目标是创建一个......的数据库模式。

  • 两个表,“行”和“列”
  • Row有两列:ID和Description。
  • 列有三列:ParentID,SortID和Value。

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

但是,NHibernate每次都在和我作战。它坚持我必须有Column字段的ID。我想我有几个问题:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

在OOP建模中,有两种不同的类型。引用类型和值类型。它们之间的区别在于,对于参考类型,您关心的是哪个,由某个标识符标识,以及您关心的 的值类型。< / p>

一个简单的例子就是.net world is

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

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

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

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

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