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

时间:2015-05-20 09:13:27

标签: c# nhibernate many-to-many nhibernate-mapping

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

1 个答案:

答案 0 :(得分:1)

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

可以肯定的是,它不是None,请尝试使用session.Flush();追加到第一位。

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

为什么简单插入User和Role的原因是由于这两个ID生成器设置为native:

<generator class="native" />

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

9.6. Flush

  

...除非您明确指出 Flush() ,否则绝对无法保证Session何时执行ADO.NET调用,只保证执行它们的顺序。 ...