尝试保存实体之间的多对多关系时出现空关联 table

Empty association table when trying to save many-to-many relationships between entities

我有 User 个实体(User mapping file)和 Role 个实体(Role mapping file)。我创造 一些 Users 和 Roles,将角色分配给用户,将用户分配给角色,保存 全部,检索 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
    }
}

角色和用户 table 按预期填写,用户角色 table 得到 创建,但为空。那我错过了什么?

配置:

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

可以肯定的是,它不是 None,尝试先使用 session.Flush(); 追加。

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

简单插入用户和角色的原因是,这两个 ID 生成器设置为本机:

<generator class="native" />

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

9.6. Flush

... Except when you explicity Flush(), there are absolutely no guarantees about when the Session executes the ADO.NET calls, only the order in which they are executed. ...