流畅的NHibernate多对多在链接表上创建聚簇索引

时间:2010-08-05 11:08:50

标签: nhibernate orm fluent-nhibernate

我有两个多对多关系的实体。

 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上创建主键,同时不能是两个相同的链接。

由于

2 个答案:

答案 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类来执行相反的映射,并在那里标记反向。

希望这有帮助。