好的。我看过很多类似的情况,但它们似乎都与一对多映射有关。
长话短说...这是代码。
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/