尝试保存实体之间的多对多关系时出现空关联 table
Empty association table when trying to save many-to-many relationships between entities
我有 User
个实体(User mapping file)和
Role
个实体(Role mapping file)。我创造
一些 User
s 和 Role
s,将角色分配给用户,将用户分配给角色,保存
全部,检索 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 得到
创建,但为空。那我错过了什么?
配置:
- .Net 4.5
- NHibernate 4.x
- SQL 服务器 2008
您的映射似乎是正确的。只是不确定会话默认值 FlushMode 是什么。
可以肯定的是,它不是 None
,尝试先使用 session.Flush();
追加。
using (ISession session = NHibernateHelper.OpenSession())
{
...
session.Flush();
}
简单插入用户和角色的原因是,这两个 ID 生成器设置为本机:
<generator class="native" />
这意味着,即使没有 session.Flush() NHibernate 也必须执行 INSERT 以获得 ID
... 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. ...
我有 User
个实体(User mapping file)和
Role
个实体(Role mapping file)。我创造
一些 User
s 和 Role
s,将角色分配给用户,将用户分配给角色,保存
全部,检索 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 得到 创建,但为空。那我错过了什么?
配置:
- .Net 4.5
- NHibernate 4.x
- SQL 服务器 2008
您的映射似乎是正确的。只是不确定会话默认值 FlushMode 是什么。
可以肯定的是,它不是 None
,尝试先使用 session.Flush();
追加。
using (ISession session = NHibernateHelper.OpenSession())
{
...
session.Flush();
}
简单插入用户和角色的原因是,这两个 ID 生成器设置为本机:
<generator class="native" />
这意味着,即使没有 session.Flush() NHibernate 也必须执行 INSERT 以获得 ID
... 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. ...