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 に答える