1

对象A具有一对多关联:许多对象B

当我查看数据库时TableB——我希望看到唯一的、可读的字符串,A.Name而不是总是在代理整数标识符上加入或子选择来查看名称。

我可以映射Name为 的标识符A,但这会导致大量额外的SELECT查询,因为 NHibernate 无法识别 的实例A是瞬态的还是持久的。

我想我可以使用复合键,将本地分配的代理键与自然键结合起来。这似乎不是最理想的,但我很想听听一些意见。

我真正想要的是一种使用单列自然键同时允许 NHibernate 识别瞬态实例的策略。

  • 可能吗?
  • 什么是映射——fluent 还是 hbm?

另一方面,如果这一切都是一个糟糕的想法,我应该只依靠带有子选择的数据库视图,请解释一下。

谢谢。

4

1 回答 1

1

这是一个糟糕的主意,当您需要“查看数据库”时,您应该创建一个视图来执行联接。

这是一个糟糕的主意,因为 Name 不是表 A 的主键。

但是我认为,如果您对 A.Name 施加唯一约束并将其映射为标识符,您就可以做到这一点。我不确定 NHibernate 是否默认为未保存值的 null 或空字符串,但您可以使用

Id(x => x.Name).GeneratedBy.Assigned().UnsavedValue(string.Empty); // or null

如果使用 string.Empty,则 A 的构造函数必须将 Name 初始化为 string.Empty。我还会从 A 中删除代理标识符,也可能是表本身,因为它没有任何用途。

于 2010-06-23T18:33:15.040 回答