我正在尝试学习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; }
}
我的最终目标是创建一个......的数据库模式。
因为列只能属于一行,并且理想情况下每列在每个ParentID中都有唯一的排序ID,所以Column表的主键可以是ParentID和SortID,而不是第四个“ID”列。
但是,NHibernate每次都在和我作战。它坚持我必须有Column字段的ID。我想我有几个问题:
答案 0 :(得分:1)
ORM通常可以映射主键和复合主键标识符。从这两个选项中,您应该选择最适合您的用例的选项。
要了解如何映射复合主键标识符,请阅读Nhibernate文档中的composite-id部分。
所有这些,根据经验,我发现非复合主键标识符是您的ORM最好的朋友。在许多情况下,它使生活变得更加容易,例如基于应用程序的id生成,批处理等。在类似于“列”表的表中,我更喜欢使用合成主键标识符(Surrogate key)。但同样,这取决于你的需要,YMMV。
答案 1 :(得分:0)
一个简单的例子就是.net world is
DateTime d1 = new DateTime(2012,12,21);
DateTime d2 = new DateTime(2012,12,21);
现在我们真的关心这两个日期时间是否指向不同的内存实例(他们指出了这一点)
不,但我们只关心它们是什么,因此它们是平等的。
您应该首先确定您的实体应该是值类型还是引用类型。如果它是引用类型,您应该遵守上面的定义并给nhibernate一些标识符。如果您不能提供标识符,那么它应该是值类型。在这种情况下,你不关心它是哪一个,而是它是什么。对于这种情况,nhibernate为您提供组件。对于可以存在于同一个表中或单独存在的组件,不需要定义ID。但是,nhibernate不会将它们视为一个实体。