确定。我已经阅读了很多类似的情况,但所有这些情况似乎都与一对多的映射有关。
长话短说......这是代码。
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,它就像魅力一样。显然我有命名约定问题或映射问题本身。
在我写这篇文章的时候,我看到有类似问题突然出现在我右边的问题,但没有一个能解决我的问题。
谢谢。
答案 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");