代码之家  ›  专栏  ›  技术社区  ›  isuruceanu

Fluent NHibernate多对多在链接表上创建聚集索引

  •  6
  • isuruceanu  · 技术社区  · 15 年前

    我有两个实体处于多对多关系中。

     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);
    
        }
    }
    

    或者只是在两个列上的用户组上创建一个主键,因为不能同时有两个相同的链接。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  3
  •   Daniel Schilling Aaron Palmer    13 年前

    我猜你想要的是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.
    

    如果你想一想什么是包和套装,这是有道理的。集合的元素应该是唯一的,而袋子没有唯一性要求。

        2
  •  0
  •   Adam Dymitruk    14 年前

    你需要 IAutoMappingOverride<Member> mapping.HasManyToMany . 如果你想要一个双向的关系,你需要做一个相反的映射 MemberMappingOverride 同学们,你们在那个里做了反向标记。