0

nullの可能性があるエンティティにコンポーネントがあります。これは、InMemoryデータベースを使用した単体テストでは機能しますが、ファイルベースのSQLiteデータベースでは機能しません。コンポーネントが設定されているかどうかを示すためにブールフラグを使用していますが、これはハックのようです。

これはNHibernateまたはSQLiteのバグですか?または私は何かが欠けていますか?

これがビジネス価値を取り除いた私のマッピングです:

public sealed class EntityMap : ClassMap<Entity>
{
   public EntityMap()
   {
     Not.LazyLoad();
     Id(m => m.Uid);
     Map(m => m.HasComponent).Not.Nullable();
     Component(m => m.Component).ColumnPrefix("Component");
   }
}

public sealed class MyComponentMap : ComponentMap<MyComponent>
{
   public MyComponentMap()
   {
     Map(c => c.SomeBasicProperty).Nullable();
     HasMany(c => c.ListOfValues).AsList(li => li.Column("Number"))
                           .Component(part => 
                                         {
                                             part.Map(s => s.Name);
                                             part.Map(s => s.Value);
                                         }
                            .Table("ComponentValues")
                            .Cascade.AllDeleteOrphan().Not.LazyLoad();

   }
}

メモリデータベースでは、エンティティのすべての列がnullの場合、エンティティのコンポーネントはnullになります。これは私が期待することです。ファイルベースのデータベースを使用する場合、コンポーネントは空です。したがってentity.Component==null、コンポーネントがすでに設定されているかどうかを確認するために使用することはできません。

4

1 に答える 1

0

私はあなたのコードをインメモリでテストしました、そしてそれはComponent != null期待通りにインメモリデータベースに戻ります。NHibernateでは、コレクションがnullになることはありませんが、空になる可能性があり、すべてのプロパティがnullの場合にのみコンポーネントがnullになるため、コンポーネントがnullになることはありません。私はあなたが次のようにテストしたと思います

using (var tx = session.BeginTransaction())
{
    id = session.Save(new Entity());
    tx.Commit();
}

var entity = session.Get<Entity>(id);
Console.WriteLine(entity.Component == null);

Getは、Componentがnullに設定されている同じインスタンスを返します。

using (var tx = session.BeginTransaction())
{
    id = session.Save(new Entity());
    tx.Commit();
}

session.Clear();

var entity = session.Get<Entity>(id);
Console.WriteLine(entity.Component == null);

Getは、Componentがnull以外に設定されているロードされたインスタンスを返します。

于 2012-01-31T12:23:06.877 に答える