NHibernate多对多映射无效列任意[table] _ [id]

时间:2013-07-15 17:46:36

标签: fluent-nhibernate many-to-many fluent-nhibernate-mapping

确定。我已经阅读了很多类似的情况,但所有这些情况似乎都与一对多的映射有关。

长话短说......这是代码。

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 as UserID1_,roles0_.Roles_id as Roles4_1_,roles1_.RoleID as RoleID1_0_,roles1_.RoleDescription as RoleDesc2_1_0_, roles1_.RoleName as RoleName1_0_,roles1_.RoleGUID as RoleGUID1_0_ FROM Web_UserRoles roles0_ left outer join Web_Roles roles1_ on roles0_.Roles_id = roles1_.RoleID WHERE roles0_.UserID =?]

不需要太多意识到映射正在将RoleID从我的“映射实体”UserRoles转换为Roles_id,我不明白为什么。我正在遵循NHibernate的确切“方式”,但我似乎并不直截了当。

如果我在RoleID中替换SQL Server Roles_id,它就像魅力一样。显然我有命名约定问题或映射问题本身。

在我写这篇文章的时候,我看到有类似问题突然出现在我右边的问题,但没有一个能解决我的问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

因为您没有在Web_UserRoles表中明确声明字段名称,所以nHibernate通过在子集合的名称中添加_Id来推断它们,所以

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

将在Web_UserRoles表中推断出一个名为Users_Id的字段,并从HasManyToMany角色映射中推断出Roles_Id字段。

修改HasManyToMany定义以明确定义ProductInProduct表中的Parent和Child 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");