C# 与NHIbernate的多对多关系的XML映射文件
我有一个表用户,字段:Id,Username 我有一个表UserGroup,字段:Id,UsergroupName,Code 我想按用户分配几个Usergroup,也就是说,我必须有第三个表:UserId和UsergroupId,这些表名为UsersGroups 我尝试了以下代码: 用户表,XML:C# 与NHIbernate的多对多关系的XML映射文件,c#,linq,nhibernate,nhibernate-mapping,linq-to-nhibernate,C#,Linq,Nhibernate,Nhibernate Mapping,Linq To Nhibernate,我有一个表用户,字段:Id,Username 我有一个表UserGroup,字段:Id,UsergroupName,Code 我想按用户分配几个Usergroup,也就是说,我必须有第三个表:UserId和UsergroupId,这些表名为UsersGroups 我尝试了以下代码: 用户表,XML: <bag name="UsersGroups" generic="true" cascade="all" inverse="false" table="UsersGroups" >
<bag name="UsersGroups" generic="true" cascade="all" inverse="false" table="UsersGroups" >
<key column="UserId" />
<many-to-many column="GroupId" class="LookupUserGroup" />
</bag>
要向用户添加组,我在User类中使用AddGroup,我执行以下操作:
public virtual void AddGroup(UserGroup userGroup)
{
userGroup.User = this;
UsersGroups.Add(userGroup);
}
当我对用户进行查询时,我希望使用linq对代码字段进行如下检查:
var res=MyUserList中的c,其中c.UserGroup.Code==1选择c;但用户组字段在intellisense中不可用
有什么想法吗
谢谢,首先,C类的设计似乎是错误的。它们并不反映你想要建立多对多关系,而是一对多关系。因为每个组只允许一个用户通常没有意义,所以应该将UserGroup类更改为 intellisense不提供UserGroup字段的原因很简单,就是您没有这样的字段。该字段称为UsersGroups,应该是UserGroups,并且是IList 不幸的是,NHibernate 3.0中当前的Linq提供程序并不真正支持您在这里尝试执行的查询类型。相反,您可以尝试使用QueryOver。在您的情况下,它看起来像是根据
我没有实现或测试这些,所以可能会有一些小错误。Kris,关于您的设计决策的简短说明。如果您真的想要有一个真正的多对多关系,那么您不需要第三个实体用户组。您只需要用户和组实体。Nhibernate将自行处理中间表的创建。但是,我从不使用这种方法。我更喜欢使用usergroup实体的方法,因为它为您提供了额外的灵活性。您永远不知道何时需要在用户和组之间的关系中包含其他信息用户被添加到组的日期,谁创建了此关系等。因此,我将使用UsersGroups实体,但是,您创建关系的方式是用户和用户组之间的多对一,以及组和用户组之间的多对一。通过这种方式,您可以获得所需的额外灵活性。如果一个组只引用一个用户,这不是一对多关系吗?
public virtual User User { get; set; }
public virtual void AddGroup(UserGroup userGroup)
{
userGroup.User = this;
UsersGroups.Add(userGroup);
}
public class UserGroup
{
[...]
public virtual IList<User> Users { get; set; }
}
<bag name="Users" table="UsersGroups" lazy="true" cascade="all" inverse="true" >
<key column="GroupId"></key>
<many-to-many column="UserId" class="User" />
</bag>
public virtual void AddGroup(UserGroup userGroup)
{
if(!this.UsersGroups.Contains(userGroup))
{
this.UsersGroups.Add(userGroup);
userGroup.Users.Add(this);
}
}
var result = Session.QueryOver<User>()
.Right.JoinQueryOver<UserGroup>(x => x.UserGroups) // the .Right. might not be required
.Where(c => c.Code == 1)
.List();