2010-08-05 5 views
6

Tengo dos entidades en una relación muchos a muchos.Fluido NHibernate many-to-many crea índice agrupado en la tabla de enlace

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

    } 
} 

Así que desea crear un índice agrupado en dos columnas (ID de usuario, securityGroupId) de Grupos de la tabla.

O simplemente para crear una clave principal en UserGroups en ambas columnas, ya que al mismo tiempo no podría haber dos enlaces iguales.

Gracias

Respuesta

3

Supongo que está buscando la herramienta SchemaExport de NHibernate para generar estos índices/claves para usted.

Para muchos-a-muchos bolsas (tipo colección predeterminada de FluentNHibernate), SchemaExport genera:

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

Para muchos-a-muchos conjuntos, genera:

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

... así que simplemente agregue .AsSet() a su mapeo.

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

Tiene sentido, realmente, si piensas en lo que son las bolsas y los juegos. Se supone que los elementos de un conjunto son únicos, mientras que los bolsos no tienen un requisito de exclusividad.

+0

Arriba Elegido por la visibilidad, estaba buscando cómo hacer esto para "Por código" y la misma solución funciona para "Por código" también – senthil

0

Se necesitan IAutoMappingOverride<Member> lugar en la parte superior de su código. Y solo necesita uno mapping.HasManyToMany. Si quieres una relación bidireccional, debes hacer la asignación opuesta haciendo una clase MemberMappingOverride y allí marcas la inversa.

Espero que esto ayude.

Cuestiones relacionadas