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

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

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

谢谢。

最佳答案

因为您没有在 Web_UserRoles 表中显式声明字段名称,nHibernate 通过将 _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");

关于fluent-nhibernate - NHibernate 多对多映射无效列任意 [table]_[id],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660521/

相关文章:

nhibernate - 为什么 nhibernate 在/bin/debug 中查找 hibernate.cfg.xml?

ios - 预加载具有多对多关系的核心数据的最佳实践

c# - Fluent NHibernate 继承映射类型

postgresql - 模拟多对多关系的最佳方式是什么

c# - Fluent NHibernate - 从映射覆盖表名

c# - 双向保存的流畅 nhibernate 映射

fluent-nhibernate - 流利的 NHibernate : override derived classes not in the base class auto-mapping

asp.net-mvc - FluentNHibernate SchemaUpdate 不起作用

c# - 使用 C# 和 Fluent Nhibernate 在 MySQL 中使用 DateTime 保存毫秒精度

java - 如何删除JPA @ManyToMany关系中的记录?