3

好的。我读过很多类似的情况,但所有这些似乎都与一对多映射更相关。

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

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 作为 RoleDesc2_1_0_,roles1_.RoleName作为 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,它就像一个魅力。显然,我遇到了命名约定问题或映射问题本身。

在我写这篇文章的时候,我看到有类似问题的问题出现在我的右边,但它们都没有为我的问题提供解决方案。

谢谢你。

4

1 回答 1

1

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

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

将推断Users_IdWeb_UserRoles 表中命名的字段,同样Roles_Id从您的 HasManyToMany 角色映射中推断。

修改您的HasManyToMany定义以明确定义表中的 Parent 和 Child Id 列ProductInProduct应该对您的问题进行排序:

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");
于 2013-07-15T20:46:32.123 回答