我是否可以使用指定的自然密钥标识符,同时仍允许NHibernate识别瞬态实例?

时间:2010-06-23 17:24:08

标签: c# .net nhibernate surrogate-key natural-key

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

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

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

我想我可以使用复合键,将原生指定的代理键与自然键组合在一起。这似乎不太理想,但我很乐意听到一些意见。

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

  • 有可能吗?
  • 映射是什么 - 流利还是hbm?

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

感谢。

1 个答案:

答案 0 :(得分: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中删除代理标识符,也可能是表格本身,因为它没有用处。