2009-08-24 6 views
10

J'ai un problème dans l'exemple Fluent NHibernate utilisant les nombreux à plusieurs. J'ai essayé de trouver des exemples sur un cas similaire, et j'ai trouvé des tonnes, mais j'ai toujours le même problème.Courant NHibernate HasManyToMany() Cartographie

Lors de l'exécution du projet d'essai, l'exception suivante est générée:

NHibernate.PropertyAccessException: Exception a eu lieu getter project.Entities.User.UserName ---> System.Reflection.TargetException: objet ne correspondance type de cible.

Ceci est une image des tables:

Tables

et le code

public UsersMap() 
    { 

     this.Table("Users"); 
     Id(x => x.UserName).Column("Username").GeneratedBy.Assigned(); 

     Map(x => x.FirstName); 
     Map(x => x.LastName); 
     Map(x => x.Password); 
     Map(x =>x.EMail); 
     Map(x => x.Title); 
     Map(x => x.Division); 


     HasManyToMany<User>(x => x.Roles) 
      .Table("UserInRoles").ParentKeyColumn("Username") 
      .ChildKeyColumn("Usernamepk") 
      .Cascade.SaveUpdate().LazyLoad(); 


    } 

    public RolesMap() 
    { 
     this.Table("Roles"); 
     Id(x => x.ID).GeneratedBy.Assigned().Column("ID"); 
     Map(x => x.RoleName).Length(50); 

     HasManyToMany<User>(x => x.Users) 
      .Table("UserInRoles").ParentKeyColumn("ID") 
      .ChildKeyColumn("RoleIdpk").Cascade.SaveUpdate().LazyLoad(); 

    } 

est le code ici, la plupart des exemples sur le web et la page correspondances Fluent NHibernate sont écrits en de la même manière, donc des idées?

Répondre

15

En ce qui concerne le code, je me sers dans mon projet, je définirais vos relations ManyToMany ainsi:

public UsersMap() 
    { 
... 
      HasManyToMany(x => x.Roles) 
       .WithTableName("UserInRoles") 
       .WithParentKeyColumn("Usernamepk") 
       .WithChildKeyColumn("RoleIdpk"); 
    } 

    public RolesMap() 
    { 
... 
      HasManyToMany(x => x.Users) 
       .WithTableName("UserInRoles") 
       .WithParentKeyColumn("RoleIdpk") 
       .WithChildKeyColumn("Usernamepk"); 

    } 

Une telle définition fonctionne pour moi. Cochez cette case puis décorer avec LazyLoading et d'autres propriétés.

+4

btw, im utilisant Fluent version 1.0, de sorte que le .WithTableName() est Table() à la place, de toute façon, j'ai essayé de l'utiliser sans lazyload et autres défeintions, mais toujours la même exception: S – Saeedouv

+1

Etes-vous sûr qu'il faut être cartographié des deux côtés? – UpTheCreek

+0

Pour ma situation, je ne veux pas lier dans les deux sens. J'ai une compagnie, une personne et une adresse et chaque entreprise ou personne peut avoir plus d'une adresse. Dans cette situation, que dois-je faire? – uzay95

Questions connexes