代码之家  ›  专栏  ›  技术社区  ›  Jay

我可以在允许nhibernate识别瞬时实例的同时使用指定的自然密钥标识符吗?

  •  1
  • Jay  · 技术社区  · 14 年前

    对象 A 有一对多关联:多对象 B .

    当我查看数据库时-- TableB --我想看看唯一的,可读的字符串 A.Name 而不必总是连接或再选择代理整数标识符来查看名称。

    我可以地图 Name 作为的标识符 但是这会导致很多额外的 SELECT 查询,因为nhibernate无法识别 是短暂的或持久的。

    我想我可以使用组合键,将本地分配的代理键与自然键组合在一起。这似乎是次优,但我想听听意见。

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

    • 有可能吗?
    • 什么是映射——Fluent或HBM?

    另一方面,如果这都是一个糟糕的想法,我只需要依赖带有子集的数据库视图,请解释一下。

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jamie Ide    14 年前

    这是一个糟糕的想法,当您需要“在数据库中查找”时,您应该创建一个视图来连接这些场合。

    这是一个糟糕的想法,因为名称不是表A的主键。

    但我认为,如果在.name上放置一个惟一的约束,并将其映射为标识符,就可以做到这一点。我不确定对于未保存的值,nhibernate是否默认为空字符串,但可以使用

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

    如果使用String.Empty,则A的构造函数必须将名称初始化为String.Empty。我还将从中删除代理标识符,也可能删除表本身,因为它不起作用。