我有兩個類,用戶和角色,定義爲:NHibvernate 3.2多對多不填充連接表
public class User : Entity
{
// other properties ...
public virtual string Username
public virtual ICollection<Role> Roles { get; set; }
}
public class Role : Entity
{
public virtual string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
在我的映射代碼,我有以下幾點:
mapper.Class<User>(map =>
{
map.Bag(x=>x.Roles,
cm=>
{
cm.Table("UserRole");
cm.Cascade(Cascade.All);
cm.Key(k => k.Column("[User]"));
},
em=>
{
em.ManyToMany(mm =>
{
mm.Column("[Role]");
});
});
});
mapper.Class<Role>(map =>
{
map.Bag(x=>x.Users,
cm=>
{
cm.Inverse(true);
cm.Table("UserRole");
cm.Key(k=>k.Column("[Role]"));
},
em =>
{
em.ManyToMany(mm =>
{
mm.Column("[User]");
});
});
});
的映射生成預期的模式,但連接表從不填充。在集合中添加一個新角色的新用戶會將角色和用戶保存到相應的表中,但連接表保留爲空。爲什麼?
編輯:我還沒有取得任何進展。我非常肯定映射是正確的,並且生成了正確的模式,但連接表根本沒有被填充。出於測試目的,我使用NBuilder像這樣產生的實體:
var roles = new Role[]
{
new Role("Admin"),
new Role("Manager"),
new Role("User")
};
var users = Builder<User>.CreateListOfSize(10)
.TheFirst(1)
.Do(x =>
{
x.Roles.Add(roles[0]);
x.Roles.Add(roles[1]);
roles[0].Users.Add(x);
roles[1].Users.Add(x);
})
.All()
.With(x => x.Id = 0)
.And(x => x.Version = 0)
.And(x => x.Username = "test user")
.And(x => x.Password = "test password")
.Do(x =>
{
x.Roles.Add(roles[2]);
roles[2].Users.Add(x);
}
.Build();
foreach (var u in users) session.Save(u);
用戶和角色實體正確地持久,但連接表保持爲空。這意味着我以後無法有效地查詢給定用戶的角色,從而使這一點無效。
很好,你想通了! – 2012-04-01 17:21:30
另外我認爲,session.Flush();保存後也應該工作(沒有明確的交易)。用戶和角色在不需要交易的情況下被保存,因爲在NH可以將記錄保存到交叉表之後,NH需要從數據庫獲得反饋(如自動生成的ID)。 – 2012-04-01 17:33:32
不要試圖通過使用flush來解決此問題。 nhibernate被設計爲使用明確的轉換,所以你想擁抱這一點。見例如NHProf文檔:http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions – 2012-04-01 18:27:05