Fluent Nhibernate&;SQLite映射组件
本文关键字:SQLite 映射 组件 amp Nhibernate Fluent | 更新日期: 2023-09-27 18:21:53
我在一个实体上有一个可能为null的组件。这适用于InMemory数据库的单元测试,但不适用于基于文件的SQLite数据库。我使用一个布尔标志来指示组件是否已设置,但这似乎是一个破解。
这是NHibernate还是SQLite Bug?还是我错过了什么?
以下是我去掉业务价值的映射:
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
来检查组件是否已经设置。
我用inmemory测试了您的代码,它按预期为inmemory数据库返回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。