首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用NBuilder测试NHibernate映射

使用NBuilder测试NHibernate映射
EN

Stack Overflow用户
提问于 2012-05-11 21:04:13
回答 1查看 275关注 0票数 0

我已经在单元测试中使用NBuilder来模拟内存中的数据了,这是很棒的,然后我想用它来测试我的NHibernate映射,我认为它是透明的,但是我无法弄清楚我做错了什么=(它根本不起作用)。

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

作为一个快速的参考:

代码语言:javascript
复制
        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();
        });

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

手动:

代码语言:javascript
复制
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自动填充测试数据,如下所示:

代码语言:javascript
复制
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行(或未保存的值映射不正确):

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-12 00:48:50

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

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10558613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档