Fluent nhibernate NHibernate多对多映射无效列任意[table]\uID]

Fluent nhibernate NHibernate多对多映射无效列任意[table]\uID],fluent-nhibernate,many-to-many,fluent-nhibernate-mapping,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 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.Roles1][SQL:选择角色0。UserID作为UserID1,角色0。角色id作为Roles4,角色1。角色id作为RoleID1,角色1。角色描述作为RoleDesc2,角色1,角色1。角色名称作为RoleName1,角色1。角色名称作为RoleName1,角色1。角色名称作为RoleName1,角色1。角色名称作为RoleGUID1,角色0从Web角色角色角色0离开外部加入Web角色1。角色id=roleuid=rolled1。其中,角色id=roles0]

不需要花太多时间就可以意识到映射正在将RoleID从映射实体UserRoles转换为Roles_id,我不明白为什么。我正按照NHibernate的方式进行操作,但我似乎没有弄清楚

如果我用RoleID替换SQL Server中的角色id,它就像一个符咒,显然我有命名约定问题或映射问题本身

当我写这篇文章的时候,我看到我的右边突然出现了一些问题,这些问题与我的担忧类似,但没有一个能解决我的问题


谢谢。

因为您尚未在Web\u UserRoles表中明确声明字段名,所以nHibernate通过向子集合的名称添加一个\u Id来推断字段名

HasManyToMany(x => x.Users)
     .Cascade.All()
     .Inverse()
     .Table("Web_UserRoles");
将在Web_UserRoles表中推断名为Users_Id的字段,同样,将从HasManyToMany角色映射中推断Roles_Id

修改HasManyToMany定义以显式定义ProductInProduct表中的父Id列和子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");