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

isu*_*anu 6 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);

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想在表UserGroups的两列(userId,securityGroupId)上创建聚簇索引.

或者只是在两个列上的UserGroups上创建主键,因为同时不能是两个相同的链接.

谢谢

Dan*_*ing 3

我假设您希望 NHibernate 的SchemaExport工具为您生成这些索引/键。

对于多对多(FluentNHibernate 的默认集合类型),SchemaExport 生成:

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
)
Run Code Online (Sandbox Code Playgroud)

对于多对多集合,它生成:

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
    primary key (securityGroupId, userId)
)
Run Code Online (Sandbox Code Playgroud)

...所以只需添加.AsSet()到您的映射中即可。

mapping.HasManyToMany(x => x.Members)
    .AsSet()
    // ... etc.
Run Code Online (Sandbox Code Playgroud)

如果您考虑一下手袋和套装是什么,这确实是有道理的。套装中的元素应该是唯一的,而包则没有唯一性要求。