【问题标题】:Primary AND composite keys in one Entity with Fluent Nhibernate具有 Fluent Nhibernate 的一个实体中的主键和复合键
【发布时间】:2012-02-16 20:55:29
【问题描述】:

这是我的问题:

域:我有以下实体:可以定位在 [位置] 的 [传感器]。这是一个多对多的关系。我将其拆分为两个一对多,以在 [Location] 处聚合 [Sensor] 的 [Position]。中间实体是 [SensorPosition]。

[SensorPosition] 的映射如下:

 CompositeId().KeyReference(sp => sp.Sensor).KeyReference(sp => sp.Location);
        References(sp => sp.Sensor).ForeignKey().Not.Nullable();
        References(sp => sp.Location).ForeignKey().Not.Nullable();
        Component(sp => sp.Position, p =>
                                         {
                                             p.Map(pos => pos.X);
                                             p.Map(pos => pos.Y);
                                             p.Map(pos => pos.Z);
                                         });

我正在使用 CompositeId() 来强制在一个 [Location] 上仅限制一个 [Sensor]。 (同一个 [Sensor] 可以在不同的 [Location] 上,这是一个业务逻辑扭曲)

我的问题是:我可以在其中添加一个生成的主键(Id)吗?我已经尝试过了,但是在映射中使用 CompositeId() 时它没有被生成。或者有没有其他方法可以流畅地执行此约束?

【问题讨论】:

    标签: nhibernate fluent-nhibernate mapping


    【解决方案1】:

    我会避免使用复合主键。此映射可以强制执行唯一性:

    References(sp => sp.Sensor).UniqueKey("KeyName");
    References(sp => sp.Location).UniqueKey("KeyName");
    

    更多详情请看question。

    【讨论】:

    • 谢谢,这使我的测试通过了。
    【解决方案2】:

    要生成复合主键 ID,您需要在外键属性和复合 ID 中引用的每个实体之间建立 bi-directional relationship。当您创建 SensorPosition 的实例时,将每个 References 属性分配给构成键的适当实体,NHibernate 将使用它们的 Id 值作为 SensorPosition 键。

    从长远来看,使用"surrogate" 键而不是composite key in NHibernate 会更简单(并且通常推荐)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多