当试图保存实体之间的多对多关系时,清空关联表

本文关键字:关系 清空 关联 保存 实体 之间 | 更新日期: 2023-09-27 17:49:49

我有User实体(用户映射文件)和Role实体(角色映射文件)。我创建了部分User节点和Role节点,将角色分配给用户,将用户分配给角色整批,检索User并测试一些假设(失败)。

下面是我的测试代码:
[Test]
public void TestUsersAndRolesWithoutWrappers()
{
    //Ensure numOfUsers <= numOfRoles
    int numOfUsers = 3, numOfRoles = 4, i;
    User userW = null;
    Role roleW = null;
    List<User> userWList = new List<User>(numOfUsers);
    List<Role> roleWList = new List<Role>(numOfRoles);
    for (i = 0; i < numOfRoles; i++)
    {
        roleW = new Role();
        roleW.Name = "Role" + (i + 1);
        roleWList.Add(roleW);
    }
    for (i = 0; i < numOfUsers; i++)
    {
        userW = new User();
        userW.Uname = "username" + (i + 1);
        userW.Email = "username" + (i + 1) + "@example.com";
        userW.Roles.Add(roleWList[i]);
        roleWList[i].Users.Add(userW);
        userWList.Add(userW);
    }
    userWList[0].Roles.Add(roleWList[numOfRoles - 1]);
    roleWList[numOfRoles - 1].Users.Add(userWList[0]);
    using (ISession session = NHibernateHelper.OpenSession())
    {
        foreach (Role listRoleW in roleWList)
        {
            session.Save(listRoleW);
        }
        foreach (User listUserW in userWList)
        {
            session.Save(listUserW);
        }
    }
    using (ISession session2 = NHibernateHelper.OpenSession())
    {
        User fromDb = session2.Get<User>(userWList[0].ID);
        Assert.AreNotSame(userWList[0], fromDb);
        Assert.AreEqual(2, fromDb.Roles.Count); //This fails, as the actual count is 0
    }
}

角色和用户表按预期填充,UserRoles表得到创建了,但是是空的。那么我错过了什么呢?

配置:

  • 。Net 4.5
  • NHibernate 4. x
  • SQL Server 2008

当试图保存实体之间的多对多关系时,清空关联表

您的映射似乎是正确的。只是不确定会话默认FlushMode是什么。

要确定的是,它不是None,尝试先使用session.Flush();追加到。

using (ISession session = NHibernateHelper.OpenSession())
{
    ...
    session.Flush();
}

简单插入用户和角色的原因是,这两个ID生成器集是原生的:

<generator class="native" />

这意味着,即使没有session.Flush(), NHibernate也必须执行INSERT来获取ID

9.6。冲洗

…除非显式地 Flush() ,否则绝对不能保证会话何时执行ADO。. NET调用,只有它们执行的顺序. ...