2010-06-23 36 views
1

对象A有一个一对多的关联:许多对象B我是否可以使用分配的自然键标识符,同时仍允许NHibernate识别瞬态实例?

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

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

我想我可以使用组合键,将本机分配的替代键与自然键组合。这看起来不太理想,但我很想听听一些意见。

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

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

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

谢谢。

回答

1

这是一个可怕的想法,您应该创建一个视图,在需要“查看数据库”时为那些场合进行连接。

这是一个可怕的想法,因为名称不表A.

的主键,但我认为你可以做到这一点,如果你把A.Name唯一约束,并将其映射作为标识符。我不知道如果NHibernate的默认设置为空或为未保存值空字符串,但使用

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

如果您使用的String.Empty比A的构造函数必须初始化名称的String.Empty你可以指定它。我还会从A中删除代理标识符,也可能是表本身,因为它没有任何用处。

+0

可怕的想法 - 罚款。为什么? – Jay 2010-06-23 18:44:55

+0

对不起,我已经扩展了它。 – 2010-06-23 18:57:58

+0

感谢您的更新。使用'UnsavedValue()'的问题是,我永远不能坚持它 - 只要我分配一个名称,NHibernate会将它视为已保存,不是? – Jay 2010-06-23 19:21:43

相关问题