単体テストでしばらくの間 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]
何かご意見は?