我正在尝试测试以下内容:
// Arrange
var alpha = new Alpha { Name = "Hello" };
var beta = new Beta { Name = "World" };
using (var t = this.Session.BeginTransaction())
{
this.Session.Save(alpha);
this.Session.Save(beta);
t.Commit();
}
// Act
using (var t = this.Session.BeginTransaction())
{
var a = this.Session.Get<Alpha>(1);
var b = this.Session.Load<Beta>(1);
a.Betas.Add(b);
t.Commit();
}
// Assert
//// this succeeds
Assert.AreEqual(1, this.Session.Get<Alpha>(1).Betas.Count, "Alpha contains beta");
//// this fails
Assert.AreEqual(1, this.Session.Get<Beta>(1).Alphas.Count, "Beta contains alpha"); fails here
Assert.AreEqual(1, this.Session.Query<Beta>().Count(), "Only one beta");
我的映射是
public AlphaMap()
{
this.Id(a => a.Id);
this.Map(a => a.Name);
this.HasManyToMany(a => a.Betas)
.Cascade.All()
.Table("AlphaBetas")
.ParentKeyColumn("AlphaId")
.ChildKeyColumn("BetaId");
}
和
public BetaMap()
{
this.Id(a => a.Id);
this.Id(a => a.Name);
this.HasManyToMany(a => a.Alphas)
.Cascade.All()
.Inverse()
.Table("AlphaBetas")
.ParentKeyColumn("BetaId")
.ChildKeyColumn("AlphaId");
}
我不确定为什么多对多关系的Beta方面没有更新。有人可以向我解释一下 - 我是NH新手,所以我可能会错过一些明显的东西。
答案 0 :(得分:1)
这里的要点是,第二个关系没有在C#中设置。我们只能看到:a.Betas.Add(b);
。而这些对象仍然在会话中。因此,测试是在内存中仍保留的对象上完成的。
在断言之前调用session.Clear()
,并且将加载最新数据...从两侧正确分配。
注意:在多对多上也要小心这些级联设置。它们不会影响配对表......它们会影响另一端