Свободный компонент отображения Nhibernate & SQLite - PullRequest
0 голосов
/ 31 января 2012

У меня есть компонент на объекте, который может быть нулевым.Это работает в модульном тесте с базой данных 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();

   }
}

С базой данных памяти компонент на объекте равен нулю, когда все столбцы для него равны нулю.Это то, что я ожидаю.При использовании файловой базы данных компонент пуст.Поэтому я не могу использовать entity.Component==null, чтобы проверить, был ли компонент уже установлен.

1 Ответ

0 голосов
/ 31 января 2012

Я протестировал ваш код с помощью памяти, и он возвращает 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 установлен в ненулевое значение.

...