使用Fluent Nhibernate将主键和复合键合并到一个实体中

使用Fluent Nhibernate将主键和复合键合并到一个实体中,nhibernate,fluent-nhibernate,mapping,Nhibernate,Fluent Nhibernate,Mapping,我的问题是: 域:我有以下实体:[传感器]可以定位在[位置]。这是一种多对多的关系。我将其分解为两个一对多,以聚合[Location]处的[Sensor]的[Position]。中间实体为[SensorPosition] [SensorPosition]的映射如下: CompositeId().KeyReference(sp => sp.Sensor).KeyReference(sp => sp.Location); References(sp => sp.S

我的问题是:

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


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

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

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

有关更多详细信息,请参见此。

要生成复合主键ID,您需要在外键属性和复合ID中引用的每个实体之间建立一个连接。创建SensorPosition实例时,将每个引用属性指定给组成键的相应实体,NHibernate将使用其Id值作为SensorPosition键


从长远来看,使用密钥而不是密码要简单得多(通常推荐使用)。

谢谢,这让我的测试通过了。