我有2个表与manyToMany关系。
public class User
{
public virtual Guid Id { get; set; }
public virtual UInt64 UserId { get; set; }
public virtual IList<Group> Groups{ get; set; }
}
public class Group
{
public virtual Guid Id { get; set; }
public virtual Guid GroupGuid { get; set; }
public virtual IList<User> Users{ get; set; }
}
我使用Fluent NHibernate自动映射它们如下:
.Override<User>(obj => obj.HasManyToMany(x => x.Groups).Table("UserToGroup").Cascade.AllDeleteOrphan())
.Override<Group>(obj => obj.HasManyToMany(x => x.Users).Table("UserToGroup").Cascade.AllDeleteOrphan().Inverse())
当我添加包含组列表的用户时,所有表都更新了OK: 在User表中插入新用户。好 在组表中插入新组。好 在userToGroup表中插入新关系。行
我使用以下代码添加用户(包括组):
public void AddUser(User userData, IList<Guid> groupIds)
{
User user = new User();
user.UserId = userData.UserId;
IList<User> Users = new List<Users();
Users.Add(user);
IList<Group> groups = new List<Group>();
foreach (Guid groupId in groupIds)
{
Group grp = new Group();
grp.GroupGuid = groupId;
grp.Users = Users;
groups.Add(grp);
}
user.Groups = groups;
Session.Save(user);
}
问题: 当我添加包含GroupGuid已存在于Group表中的新用户时,会将新记录插入到具有相同GroupGuid和新ID的Group表中。
问题:
如何让NHibernate仅向Group表添加新的GroupGuid ID?并且仍然在UserToGroup表中添加一个关系,该关系将新用户与现有组相关联。
在AddUser方法中 - 我应该设置实体的两边,即设置user.Groups with group list并设置group.Users with user list?
谢谢, Haimon。
答案 0 :(得分:2)
您遇到此问题的原因是,当您将它们与User对象关联时,您可能正在使用未关联的Group实体。所以你需要从数据库加载它们。
或者,您可以切换为使用Guids作为实体的ID,而不是您设置的其他主键。
要回答你的第二个问题,你应该能够设定关系的一面。但是,我很困惑为什么你会有两个单独的关系表。您通常只需要另外一个表:
User
Group
UserGroup