关于NHibernate中关系表的操作
Nhibernate中的inverse属性负责维护关系表。
数据关系图
单方维护关系表
/// <summary>
/// 1)创建User
/// 2)建立Group并将User添加到Group.Users中
/// 3)创建Group
/// </summary>
private static void CreateGroupAndUser()
{
string username = "User_" + Guid.NewGuid().ToString().Substring(0, 8);
string groupname = "Group_" + Guid.NewGuid().ToString().Substring(0, 8);
UserDAL userDAL = new UserDAL(SessionManager_NHibernateSample.GetSession());
UserModel user = new UserModel();
user.UserName = username;
int userId = userDAL.CreateUser(user);
GroupModel group = new GroupModel();
group.GroupName = groupname;
group.Users = new Iesi.Collections.Generic.HashedSet<UserModel>();
group.Users.Add(user);
GroupDAL groupDAL = new GroupDAL(SessionManager_NHibernateSample.GetSession());
int groupId = groupDAL.CreateGroup(group);
}
上述代码中,如果想让group.Users.Add(user);执行时自动往关系表UserGroup中插入关系数据,则:
GroupMode.hbm.xml中的inverse属性应该设置为false
UserMode.hbm.xml中的inverse属性应该设置为true
如下图所示:
inverse 属性为 false 表示我来维护关系表。
inverse 属性为 true 表示对方维护关系表。
/// <summary>
/// 1)创建Group
/// 2)建立User并将Group添加到User.Groups中
/// 3)创建User
/// </summary>
private static void CreateUserAndGroup()
{
string username = "User_" + Guid.NewGuid().ToString().Substring(0, 8);
string groupname = "Group_" + Guid.NewGuid().ToString().Substring(0, 8);
GroupModel group = new GroupModel();
group.GroupName = groupname;
GroupDAL groupDAL = new GroupDAL(SessionManager_NHibernateSample.GetSession());
int groupId = groupDAL.CreateGroup(group);
UserModel user = new UserModel();
user.UserName = username;
user.Groups = new Iesi.Collections.Generic.HashedSet<GroupModel>();
user.Groups.Add(group);
UserDAL userDAl = new UserDAL(SessionManager_NHibernateSample.GetSession());
int userId = userDAl.CreateUser(user);
}
按照第一个代码的说法,如果想让user.Groups.Add(group);执行时自动往关系表UserGroup中插入关系数据,则:
UserMode.hbm.xml中的inverse属性应该设置为false
GroupMode.hbm.xml中的inverse属性应该设置为true
双方都维护关系表
将双方的inverse属性都设置为false
最后
inverse属性的默认值为false