Fluent Nhibernate的一个实体中的主AND复合键



这是我的问题:

域:我有以下实体:可以定位在[Location]的[Sensor]。这是一种多对多的关系。我将其分解为两个一对多,以聚合[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]的约束。(相同的[传感器]可以在不同的[位置],这是一个商业逻辑转折)

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

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

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

有关更多详细信息,请参阅此问题。

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

从长远来看,在NHibernate中使用"代理"密钥而不是复合密钥要简单得多(通常建议使用)。

最新更新