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

发布于 2024-09-13 04:15:13 字数 708 浏览 3 评论 0原文

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

 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)上创建聚集索引。

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

谢谢

I have two entities in a many-to-many relationship.

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

    }
}

So I want to create an clustered index on both columns (userId, securityGroupId) from table UserGroups.

Or just to create a Primary Key on UserGroups on them both columns, as at same time could not be two same links.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你曾走过我的故事 2024-09-20 04:15:13

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

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

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
)

对于多对多 strong>,它会生成:

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
    primary key (securityGroupId, userId)
)

...因此只需将 .AsSet() 添加到您的映射中即可。

mapping.HasManyToMany(x => x.Members)
    .AsSet()
    // ... etc.

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

I assume you're wanting NHibernate's SchemaExport tool to generate these indexes/keys for you.

For many-to-many bags (FluentNHibernate's default collection type), SchemaExport generates:

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
)

For many-to-many sets, it generates:

create UserGroups (
    securityGroupId INT not null,
    userId INT not null,
    primary key (securityGroupId, userId)
)

... so just add .AsSet() to your mapping.

mapping.HasManyToMany(x => x.Members)
    .AsSet()
    // ... etc.

It makes sense, really, if you think about what bags and sets are. The elements of a set are supposed to be unique, whereas bags don't have a uniqueness requirement.

何以心动 2024-09-20 04:15:13

您需要将 IAutoMappingOverride 放在代码顶部。而且您只需要一个 mapping.HasManyToMany。如果您想要双向关系,则需要通过创建一个 MemberMappingOverride 类来执行相反的映射,并在那里标记为反向。

希望这有帮助。

You need IAutoMappingOverride<Member> instead at the top of your code. And you only need one mapping.HasManyToMany. If you want a bidirectional relationship, you need to do the opposite mapping by making a MemberMappingOverride class and there you mark inverse.

Hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文