这是我的问题:
域:我有以下实体:[传感器]可以放在[位置]。这是一种多对多的关系。我把它分成两个一对多来聚合[位置]处的[传感器]的[位置]。中间实体是[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()。或者是否有其他方法来强制执行此约束流利?
答案 0 :(得分:1)
我会避免使用复合主键。可以通过此映射强制执行Uniquenes:
References(sp => sp.Sensor).UniqueKey("KeyName");
References(sp => sp.Location).UniqueKey("KeyName");
有关详细信息,请参阅此question。
答案 1 :(得分:1)
要生成复合主键ID,您需要在外键属性与复合ID中引用的每个实体之间建立bi-directional relationship。创建SensorPosition实例时,将每个References属性分配给组成密钥的相应实体,NHibernate将使用其Id值作为SensorPosition键。
从长远来看,使用"surrogate"密钥而不是composite key in NHibernate会更简单(并且通常建议使用)。