好的。我读过很多类似的情况,但所有这些似乎都与一对多映射更相关。
长话短说......这是代码。
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,它就像一个魅力。显然,我遇到了命名约定问题或映射问题本身。
在我写这篇文章的时候,我看到有类似问题的问题出现在我的右边,但它们都没有为我的问题提供解决方案。
谢谢你。