nhibernate – Mappage plusieurs à plusieurs avec atsortingbut

J’ai 2 tables maîtresses qui sont liées par une table de carte comme ci-dessous

User [UserId,Name] Resource [ResourceId,Name] UserResourceMap [UserId,ResourceId,AccessLevel] 

À quoi ressemblerait le classmap ressource et utilisateur avec AccessLevel en tant qu’atsortingbut de ressource?

Les classes de mon domaine ressemblent à ceci

 public class User { public virtual int UserId { get;protected set; } public virtual ssortingng Name { get;set; } } public class Resource { public virtual int ResourceId { get;protected set; } public virtual ssortingng Name { get;set; } public virtual ssortingng AccessLevel { get;set; }//Issue-populate this using fluent } 

Comment utiliser couramment le mappage de l’atsortingbut accessLevel dans le code ci-dessous.

 public class UserMap : ClassMap { public UserMap() { Table("User"); Id(x => x.Key); Map(x=>x.Name); } } public class ResourceMap : ClassMap { public ResourceMap() { Table("Resource"); Id(x => x.Key); Map(x=>x.Name);//Need some Map Here to make a hasManyToMany Map with atsortingbute } } 

Votre modèle de domaine ne semble pas correspondre à votre modèle de firebase database – la classe Resource a la propriété AccessLevel (c’est-à-dire un AccessLevel par ressource), mais dans le modèle de firebase database, AccessLevel est une colonne de la table (c’est-à-dire une relation AccessLevel par ressource).

En supposant que le modèle de firebase database soit le modèle correct (assez simple), vous pouvez le mapper en introduisant une classe comme celle-ci.

 public class UserResource { public virtual int UserResourceId { get; protected set; } public virtual User User { get; set; } public virtual Resource { get; set; } public virtual ssortingng AccessLevel { get; set; } } 

et mappez-le de cette façon:

 public class UserResourceMap : ClassMap { public UserResourceMap() { Table("UserResourceMap"); Id(x => x.UserResourceId); References(x => x.User).UniqueKey("UniqueUserAndResource"); References(x => x.Resource).UniqueKey("UniqueUserAndResource"); Map(x => x.AccessLevel); } } 

Si vous souhaitez des associations bidirectionnelles, vous pouvez également append une propriété Collection sur User et / ou Resource et les mapper avec HasMany (…). Inverse (). Bien entendu, ce type de mappage introduirait une nouvelle colonne UserResourceId dans la table UserResourceMap (l’utilisation d’une clé composite composée de User et Resource atténuerait ce risque).

Une autre solution consisterait à append une association EntityMap. Si l’association appartient à l’utilisateur, il s’agira d’une propriété Dictionary . Quelque chose comme ça pourrait faire l’affaire:

 public class User { public virtual int UserId { get; protected set; } public virtual ssortingng Name { get; set; } public virtual Dictionary Resources { get; set; } // Resource -> AccessLevel } public class UserMap : ClassMap { public UserMap() { Table("User"); Id(x => x.UserId); Map(x => x.Name); HasMany(x => x.Resources).AsEntityMap().Element("AccessLevel"); } } 

Comme vous l’avez correctement identifié dans votre schéma de firebase database, il ne s’agit pas d’une relation pure plusieurs à plusieurs: il s’agit de deux relations un à plusieurs car la table intermédiaire possède un atsortingbut (le niveau d’access).

Je pense donc que votre domaine manque d’une entité – il ne semble pas exister de relation dans votre modèle entre un utilisateur et les ressources auxquelles il peut accéder.

Que diriez-vous quelque chose comme ça:

 public class User { public virtual int Id { get;protected set; } public virtual ssortingng Name { get;set; } public virtual ICollection UserResources { get; set;} } public class UserResource { public virtual int Id { get; protected set; } public virtual User User { get; set;} public virtual Resource Resource { get; set;} public virtual ssortingng AccessLevel { get; set;} } public class Resource { public virtual int Id { get;protected set; } public virtual ssortingng Name { get;set; } } 

Et des mappings comme:

 public class UserMap : ClassMap { public UserMap() { Id(x => x.Id); Map(x => x.Name); HasMany(x => x.UserResource) .AsSet() .Inverse() .Cascade.AllDeleteOrphan(); } } public class UserResourceMap : ClassMap { public UserResourceMap() { Table("UserResourceMap"); Id(x => x.Id); References(x => x.User).Not.Nullable(); References(x => x.Resource).Not.Nullable(); Map(x => x.AccessLevel); } } public class ResourceMap : ClassMap { public ResourceMap() { Cache.ReadOnly(); Id(x => x.Id); Map(x => x.Name); } }