3

好的。我已經閱讀了很多類似的情況,但它們都似乎更多地與一對多映射有關。NHibernate多對多映射無效列任意[table] _ [id]

長話短說...這是代碼。

public class Roles 
    { 
     public virtual int RoleID { get; protected set; } 
     public virtual Guid RoleGUID { get; protected set; } 
     public virtual string RoleName { get; protected set; } 
     public virtual string RoleDescription { get; protected set; } 
     public virtual IList<User> Users { get; protected set; } 
    } 


public class RolesMap:ClassMap<Roles> 
    { 
     public RolesMap() 
     { 
      Table("Web_Roles"); 
      Id(x => x.RoleID); 
      Map(x => x.RoleDescription); 
      Map(x => x.RoleName); 
      Map(x => x.RoleGUID); 
      HasManyToMany(x => x.Users) 
       .Cascade.All() 
       .Inverse() 
       .Table("Web_UserRoles"); 
     } 

    } 


public class User 
{ 
    public virtual int UserID { get; protected set; } 

    public virtual string UserName { get; protected set; } 
    public virtual string Password { get; protected set; } 
    public virtual string Email { get; protected set; } 
    public virtual Guid UserGUID { get; protected set; } 
    public virtual IList<Roles> Roles { get; protected set; } 
} 



public class UserMap: ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Web_User"); 
     Id(x => x.UserID); 

     Map(x => x.UserName); 
     Map(x => x.Password); 
     Map(x => x.UserGUID); 
     Map(x => x.Email); 
     HasManyToMany(x => x.Roles) 
      .Cascade.All() 
      .Table("Web_UserRoles"); 
    } 
} 


public class UserRoles 
{ 
    public virtual int RoleID { get; protected set; } 
    public virtual int UserID { get; protected set; } 
} 

因此,這是域實體及其各自的映射。不大。當然,UserRoles沒有映射,因爲它只是一個「映射表」。

當我得到我的用戶,我得到以下錯誤。

無法初始化集合:[FamilyDerm.AUTH.Domain.User.Roles#1] [SQL:SELECT roles0_.UserID爲UserID1_,roles0_.Roles_id爲Roles4_1_,roles1_.RoleID爲RoleID1_0_,roles1_.RoleDescription爲RoleDesc2_1_0_ ,roles1_.RoleName爲RoleName1_0_,roles1_.RoleGUID作爲RoleGUID1_0_ FROM roles0_左外Web_UserRoles加入Web_Roles roles1_上roles0_.Roles_id = roles1_.RoleID WHERE roles0_.UserID =?]

它並不需要太多意識到映射將RoleID從我的「映射實體」UserRoles轉換爲Roles_id,我不明白爲什麼。我遵循NHibernate確切的「方式」,但我似乎沒有得到它的直線。

如果我通過RoleID替換SQL Server Roles_id,它就像一個魅力。顯然,我有一個命名約定問題或映射問題本身。

正如我寫這篇文章,我看到類似的問題突然出現在我的右邊的問題,但沒有一個能解決我的問題。

謝謝。

+0

難道我的回答幫助呢? – CSL

回答

1

因爲你還沒有明確宣佈在Web_UserRoles表NHibernate的通過添加_Id孩子集合的名稱來推斷它們的字段名,以便

HasManyToMany(x => x.Users) 
    .Cascade.All() 
    .Inverse() 
    .Table("Web_UserRoles"); 

會推斷出在Web_UserRoles表命名爲Users_Id場並從您的HasManyToMany角色映射中同樣選擇Roles_Id

修改您的HasManyToMany定義從您的ProductInProduct表明確地定義父和子ID列應排序您的問題:

HasManyToMany(x => x.Users) 
    .Cascade.All() 
    .Inverse() 
    .Table("Web_UserRoles") 
    .ParentKeyColumn("UserId") 
    .ChildKeyColumn("RoleId"); 

HasManyToMany(x => x.Roles) 
    .Cascade.All() 
    .Table("Web_UserRoles") 
    .ParentKeyColumn("RoleId") 
    .ChildKeyColumn("UserId"); 
+0

這應該是可以接受的答案 –