我有两个多对多关系的实体。
public class SecurityGroupMappingOverride : IAutoMappingOverride<SecurityGroup>
{
public void Override(AutoMapping<SecurityGroup> mapping)
{
mapping.HasManyToMany(x => x.Actions).ParentKeyColumn("securityGroupId").ChildKeyColumn("actionId").
LazyLoad().Table("ActionGroups");
mapping.HasManyToMany(x => x.Members).ParentKeyColumn("securityGroupId").ChildKeyColumn("userId").
LazyLoad().Inverse().Table("UserGroups");
mapping.Map(x => x.Name).Length(64);
}
}
所以我想在表UserGroups的两个列(userId,securityGroupId)上创建聚簇索引。
或者只是在两列上的UserGroups上创建主键,同时不能是两个相同的链接。
由于
答案 0 :(得分:3)
我假设你想要NHibernate的SchemaExport
工具来为你生成这些索引/键。
对于多对多 行包 (FluentNHibernate的默认集合类型),SchemaExport生成:
create UserGroups (
securityGroupId INT not null,
userId INT not null,
)
对于多对多 集 ,它会生成:
create UserGroups (
securityGroupId INT not null,
userId INT not null,
primary key (securityGroupId, userId)
)
...所以只需在映射中添加.AsSet()
即可。
mapping.HasManyToMany(x => x.Members)
.AsSet()
// ... etc.
如果你想一下袋子和套装是什么,这是有道理的。一组的元素应该是唯一的,而袋子没有唯一性要求。
答案 1 :(得分:0)
您需要IAutoMappingOverride<Member>
代替代码顶部。而且你只需要一个mapping.HasManyToMany
。如果您想要双向关系,则需要通过创建MemberMappingOverride
类来执行相反的映射,并在那里标记反向。
希望这有帮助。