我的问题是:
域:我有以下实体:传感器,可以定位在位置。这是一种多到多的关系。我把它分成两个一对多的位置来聚集一个位置的传感器。中间实体是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()在一个位置强制执行一个传感器的约束。(同一传感器可以位于不同的位置,这是业务逻辑的扭曲)
我的问题是:我可以添加一个生成的主键 (Id)吗?我已经尝试过了,但是在映射中使用CompositeId()不会生成它。或者是否有其他方法来强制执行此约束--流畅地使用?
发布于 2012-01-23 14:14:41
我将避免使用复合主键。通过这种映射可以强制执行Uniquenes:
References(sp => sp.Sensor).UniqueKey("KeyName");
References(sp => sp.Location).UniqueKey("KeyName");有关更多细节,请参见此问题。
发布于 2012-01-23 14:16:06
要生成复合主密钥ID,需要在外键属性和复合Id中引用的每个实体之间建立一个双向关系。当创建SensorPosition实例时,将每个引用属性分配给组成密钥的适当实体,NHibernate将为SensorPosition键使用它们的Id值。
从长远来看,使用“代孕”键而不是NHibernate中的复合密钥键要简单得多(通常也是推荐的)。
https://stackoverflow.com/questions/8972808
复制相似问题