使用Fluent Nhibernate将主键和复合键合并到一个实体中
我的问题是: 域:我有以下实体:[传感器]可以定位在[位置]。这是一种多对多的关系。我将其分解为两个一对多,以聚合[Location]处的[Sensor]的[Position]。中间实体为[SensorPosition] [SensorPosition]的映射如下:使用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
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键
从长远来看,使用密钥而不是密码要简单得多(通常推荐使用)。谢谢,这让我的测试通过了。