我有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调用,只有它们执行的顺序. ...