0

我在单元测试中使用 NBuilder 来模拟内存数据已经有一段时间了,它很棒,然后我想用它来测试我的 NHibernate 映射,我认为它会是透明的,但我不知道我是什么做错了=(它根本不起作用

我计划大量测试我的 NHibernate 映射,但由于我有太多实体,我不想手动填充数据,这是我想使用 NBuilder 的主要原因

作为快速参考:

        autoConfig.Override<Planet>(x =>
        {
            x.References(y => y.Sun).Cascade.SaveUpdate().Column("Star_id");
        });
        autoConfig.Override<Star>(y =>
        {
            y.HasMany(x => x.Planets).Inverse().Cascade.AllDeleteOrphan();
        });

(如果您需要,我可以提供有关实体和映射的信息,但我认为它们是正确的,因为我可以在手动填充数据时保存我的实体)

手动:

using (var session = factory.OpenSession())
using (var tran = session.BeginTransaction())
{
   var star = new Star { Class = StarTypes.B, Color = SurfaceColor.Red, Mass = 323.43, Name = "fu..nny star" };
   star.Planets = new List<Planet>
   {
      new Planet { IsHabitable = true, Name = "my pla", Sun = star }
   };
   session.Save(star);
   tran.Commit();
}

上面的代码实际上可以正确地将两个实体保存到数据库中,这意味着我的映射是正确的,但现在我想使用 NBuilder 自动填充测试数据,如下所示:

var star = Builder<Star>.CreateNew().Build();
star.Planets = Builder<Planet>.CreateListOfSize(10).All().With(x => x.Sun, star).Build();
session.Save(star);
tran.Commit();

在调试时检查生成的实体对我来说是正确的,我可以毫无问题地浏览它们,但是当我想提交事务时,我收到以下错误:

行被另一个事务更新或删除(或未保存的值映射不正确):[CH9_NHibernateLinqToNHibernate.Domain.Planet#00000000-0000-0000-0000-000000000001]

有什么想法吗?

4

1 回答 1

0

我发现了问题,基本上 NBuilder 正在为我的 Id 分配一个值,而 NHibernate 认为它“持久化”,它试图更新记录而不是创建一个新记录(虽然错误消息对我没有帮助......) :

var star = Builder<Star>.CreateNew().Build();
star.Planets = Builder<Planet>.CreateListOfSize(10).All().With(x => x.Sun, star).With(x => x.Id, Guid.Empty).Build();
于 2012-05-12T00:48:50.203 回答