1

我不是高级 NHibernate 用户,所以这可能有点重要,我只是还没有发现它.. 但到底是什么。

考虑类:

public class House
{
    public int Id { get; set; }

public ISet<Room> Rooms
{
    get;
    set;
}

}

指定 NHibernate Set 元素时,仅写以下内容是不够的:

<set name="Rooms" />

相反,我至少必须写:

<set name="Rooms">
  <key column="RoomId"/>
  <one-to-many class="Room"/>
</set>

这似乎违反了 DRY 原则。如果它是 Set,则默认应该是一对多的关系。该类应从集合的泛型类型推断,并且作为键列,应使用集合元素类的主键。

在我看来,这似乎是一个合理的默认值。那么,为什么 NHiberbate 对此并不聪明,并要求我输入这些额外的 3 行?

4

3 回答 3

1

因为,我认为,当 NH 基于映射创建代理时,还需要更长的时间来检查你的程序集,并通过反射来确定它需要做什么。这将增加 NH 工厂的启动时间。

不要忘记,它是关系映射器的对象。您至少需要一个额外的节点(密钥)来告诉它它需要使用的数据库密钥是什么。这允许您在映射到数据库时尽可能灵活,而不是硬连线到默认值。

它会破坏 DRY 吗?可能。我在乎这种情况吗?不,真的。

于 2010-02-14T15:56:31.663 回答
0

您可能会看一下Fluent NHibnernate。他们的 DSL 受到 DRY 的启发。

编辑: 对不起应该更仔细地阅读......

关于您的示例,Fluent NHibernate 将允许您将映射表示为:

HasMany(x => x.Rooms);

但是,HasMany(或一对多)关系映射到 IList。我不确定这是否可以进一步定制(让 Fluent 默认映射到 ISet)。但无论哪种方式,它的重复性都比标准映射声明少。

以下是声明映射的一些示例:Fluent NHibernate Wiki

于 2009-03-12T13:48:58.603 回答
0

如果您不使用通用集合怎么办?如果我没记错的话,NHibernate 只支持从 1.2 版开始的泛型;所以在以前的版本中,类型推断是绝对不可能的。

如果您使用遗留数据库,其中主 ID 不用作相关表中的外键怎么办?

于 2009-03-12T13:50:18.613 回答