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

这应该是可以接受的答案 –