我有User
个实体(User mapping file)和
Role
个实体(Role mapping file)。我创造
一些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表获取 创建,但是是空的。那我错过了什么?
配置:
答案 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
...除非您明确指出
Flush()
,否则绝对无法保证Session何时执行ADO.NET调用,只保证执行它们的顺序。 ...