0

我在一个可能为空的实体上有一个组件。这适用于 InMemory 数据库的单元测试,但不适用于基于文件的 SQLite 数据库。我使用布尔标志来指示组件是否已设置,但这似乎是一个 hack。

这是 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();

   }
}

对于内存数据库,当实体的所有列都为空时,实体上的组件为空。这是我所期望的。使用基于文件的数据库时,组件为空。所以我不能entity.Component==null用来检查组件是否已经设置。

4

1 回答 1

0

我用内存测试了你的代码,它Component != null按预期返回内存数据库。在 NHibernate 中,集合永远不会为空,但可以为空,并且只有当所有属性都为空时,组件才为空,因此组件永远不应为空。我猜你测试过

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 回答