具有Fluent Nhibernate的一个实体中的主要和复合键

时间:2012-01-23 14:00:43

标签: nhibernate fluent-nhibernate mapping

这是我的问题:

域:我有以下实体:[传感器]可以放在[位置]。这是一种多对多的关系。我把它分成两个一对多来聚合[位置]处的[传感器]的[位置]。中间实体是[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()。或者是否有其他方法来强制执行此约束流利

2 个答案:

答案 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会更简单(并且通常建议使用)。