2012-01-31 6 views
0

J'ai un composant sur une entité qui peut être nulle. Cela fonctionne dans un test unitaire avec une base de données InMemory, mais ne fonctionne pas sur une base de données SQLite basée sur un fichier. J'utilise un indicateur booléen pour indiquer si le composant a été défini, mais cela semble être un hack.Composant Fluid Nhibernate & SQLite mapping

Est-ce un NHibernate ou un bogue SQLite? Ou ai-je oublié quelque chose?

Voici mes correspondances dépouillées de valeur commerciale:

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

    } 
} 

Avec la base de données de la mémoire du composant sur l'entité est nulle lorsque toutes les colonnes pour elle sont nulles. C'est ce que je m'attends. Lors de l'utilisation d'une base de données basée sur des fichiers, le composant est vide. Donc, je ne peux pas utiliser entity.Component==null pour vérifier si le composant a déjà été défini.

+0

pouvez-vous poster le test unitaire pour voir ce que vous attendez et ce que vous obtenez. – Firo

+0

Je vais y voir. Le problème est que le test d'unité fonctionne, mais seulement si vous utilisez la base de données de sqlite. – sanosdole

+0

quel est le résultat quand cela fonctionne: le composant est nul, pas nul? que se passe-t-il si ça ne marche pas: le composant est nul, pas nul, exception? – Firo

Répondre

0

J'ai testé votre code avec inmemory et il renvoie Component != null pour une base de données inmemory comme prévu. Dans NHibernate, une collection n'est jamais nulle mais peut être vide et un composant n'est nul que si toutes les propriétés sont nulles, donc le composant ne devrait jamais être nul. Je suppose que vous avez testé comme

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

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

Get renvoie la même instance dont le composant est défini sur null. Get retourne l'instance chargée dont le composant est défini sur Non-null.

+0

Je pensais que la collection était la cause, mais je n'avais pas réalisé que mon test pouvait être bloqué! Encore je préférerais la manipulation correcte de null si la collection est vide ... – sanosdole

+0

pas facilement faisable parce que NH suppose que la collection pourrait être lazyloaded (où la taille n'est pas connue jusqu'à l'initialisation) et par défaut à cette conception. Soit utiliser la propriété getter pour retourner null si Component et sa collection est vide ou hack/bend NH pour faire ce que vous voulez – Firo