2010-11-04 10 views
0

Ok Je suis assez nouveau pour Fluent et NHibernate et je ne suis pas sûr de savoir comment mapper cette relation spécifique qui existe dans ma base de données. J'ai le diagramme ER ci-dessous qui décrit ma structure de table.Fluid NHibernate Objectified/Associated Relationship Mapping

ER Diagram

Voici mes classes d'entité actuelle C# et applications courant:

public class GroupHeader 
{ 
    public virtual Guid Id { get; private set;} 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual IList<RightHeader> AllowedRights { get; set; } 
    public virtual IList<RightHeader> DeniedRights { get; set; } 
    public virtual IList<RightHeader> UnsetRights { get; set; } 
} 

public class RightHeader 
{ 
    public virtual decimal Num { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

public class GroupHeaderMap : ClassMap<GroupHeader> 
{ 
    public GroupHeaderMap() 
    { 
     Table("GROUP_HEADER"); 
     Id(x => x.Id, "GROUP_ID"); 
     Map(x => x.Name, "GROUP_NAME").Unique(); 
     Map(x => x.Description, "GROUP_DESCRIPTION"); 

     HasManyToMany(x => x.AllowedRights) 
      .Table("GROUP_RIGHT_COMPOSITE") 
      .ParentKeyColumn("GROUP_ID") 
      .ChildKeyColumn("RIGHT_NUM") 
      .Where("RIGHT_VALUE = 1") 
      .Cascade.SaveUpdate(); 

     HasManyToMany(x => x.DeniedRights) 
      .Table("GROUP_RIGHT_COMPOSITE") 
      .ParentKeyColumn("GROUP_ID") 
      .ChildKeyColumn("RIGHT_NUM") 
      .Where("RIGHT_VALUE = -1") 
      .Cascade.SaveUpdate(); 

     HasManyToMany(x => x.UnsetRights) 
      .Table("GROUP_RIGHT_COMPOSITE") 
      .ParentKeyColumn("GROUP_ID") 
      .ChildKeyColumn("RIGHT_NUM") 
      .Where("RIGHT_VALUE = 0") 
      .Cascade.SaveUpdate(); 
    } 
} 

public class RightHeaderMap : ClassMap<RightHeader> 
{ 
    public RightHeaderMap() 
    { 
     Table("RIGHT_HEADER"); 
     Id(x => x.Num, "RIGHT_NUM"); 
     Map(x => x.Name, "RIGHT_NAME"); 
     Map(x => x.Description, "RIGHT_DESCRIPTION"); 
    } 
} 

Actuellement chaque fois que je crée une nouvelle GroupHeader et remplir la variable membre de AllowedRights il ne parvient pas à insérer ces enregistrements car la colonne RIGHT_VALUE dans GROUP_RIGHT_COMPOSITE n'autorise pas les valeurs nulles. Je ne suis pas vraiment sûr de savoir comment le mettre en ordre ou où je devrais vraiment gérer cela dans mes entités. Toute aide serait appréciée.

Répondre

0

Le problème que j'ai trouvé avec le mappage ci-dessus est que j'essayais de traiter la table USER_GROUP_COMPOSITE comme une relation et non comme une entité elle-même. J'ai modifié le code ci-dessus de sorte qu'une nouvelle entité appelée GroupRight existe et a des références à la fois GroupHeader et RightHeader à l'intérieur de l'entité.

Je pense que cela a résolu ma question générale sur la façon dont je devrais les cartographier, mais j'ai toujours des problèmes pour conserver ces données dans la base de données. Ma question modifiée (y compris les mises à jour à mes entités et applications) peuvent être trouvés ici Post

Les articles que je trouve utile dans la résolution de ce problème sont les suivants: Link 1 Link 2