2011-10-29 127 views
1

我想学习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; } 
} 

我的最终目标是要建立一个数据库架构,这将是...

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

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

但是,NHibernate每时每刻都在与我搏斗。它坚持我必须有一个列字段的ID。我想我有几个问题:

  1. 我的“模式目标”本身是否存在严重缺陷?对于每个Column来说,它是否有更好的设计来拥有自己的ID?如果是这样,为什么?
  2. 无论我正在寻找的模式是否是一个好设计,NHibernate中都可以完成这项工作吗?到目前为止,我已经成功地映射了“Row”类,但是如果没有NHibernate,我不能映射“Column”类,因为我不得不为它提供一个ID。 (对于它的价值,我使用Fluent NHibernate)。我如何绕过这个?

回答

1

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

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

从经验中说,我发现非复合主键标识符是您的ORMs最好的朋友。在许多情况下,它使生活变得更容易,例如基于应用程序的ID生成,批处理等。在类似于“列”表的表格中,我更喜欢有一个合成主键标识符(Surrogate key)。但是,这又取决于你的需求,YMMV。

0

in OOP建模有两种不同的类型。引用类型和值类型。它们之间的区别在于,对于引用类型,您关心的是,它们是,它们是由某个标识符标识的,对于您关心的值类型它们是什么

一个简单的例子会在。净世界是

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

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

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

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

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