将现有实体分配给多对多不会更新一方

时间:2014-01-16 10:17:36

标签: c# nhibernate fluent-nhibernate many-to-many

我正在尝试测试以下内容:

// 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新手,所以我可能会错过一些明显的东西。

1 个答案:

答案 0 :(得分:1)

这里的要点是,第二个关系没有在C#中设置。我们只能看到:a.Betas.Add(b);。而这些对象仍然在会话中。因此,测试是在内存中仍保留的对象上完成的。

在断言之前调用session.Clear(),并且将加载最新数据...从两侧正确分配。

注意:在多对多上也要小心这些级联设置。它们不会影响配对表......它们会影响另一端