2010-08-05 21 views
6

我有兩對多對多的關係。流利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上創建一個主鍵,因爲在同一時間不能是兩個相同的鏈接。

感謝

回答

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. 

如果你考慮袋子和套件,它是有道理的。一組中的元素應該是獨一無二的,而袋子沒有唯一性要求。

+0

向上投票的可見性,我正在尋找如何做到這一點的「按代碼」和同樣的解決方案適用於「按代碼」也 – senthil 2015-08-27 19:32:16

0

你需要IAutoMappingOverride<Member>而不是在你的代碼的頂部。你只需要一個mapping.HasManyToMany。如果你想要一個雙向關係,你需要做一個MemberMappingOverride類的相反的映射,然後你標記爲反向。

希望這會有所幫助。