2010-12-02 36 views
2

J'ai un mappage NHibernate Fluent qui fonctionne comme prévu lorsque je l'exécute sur la base de données SQL Server réelle, mais qui ne parcourt pas une collection d'objets enfants lors de l'exécution contre SQLite. La structure à interroger est une hiérarchie de comptes autoréférentielle dans laquelle chaque compte peut avoir un compte parent et un compte enfant 0-M. Le compte parent est chargé correctement, mais la liste des objets enfants revient toujours null.Les objets enfants ne sont pas remplis uniquement lors de l'utilisation de SQLite (Works in SQL Server)

La structure de la table de base ressemble à ceci (Note:. Je l'ai laissé de côté la plupart des champs qui n'ont rien à voir avec cette question)

Account 
------- 
AccountID 
Title 
ParentAccountID 

Les looks de classe compte comme:

public class Account 
{ 
    public virtual int ID { get; set; } 
    public virtual string Title { get; set; } 
    public virtual Account ParentAccount { get; set; } 
    public virtual IList<Account> ChildAccounts { get; set; } 
} 

la cartographie de la classe compte ressemble:

public class AccountMap : ClassMap<Account> 
{ 
    public AccountMap() 
    { 
     Table("Accounts"); 

     Id(a => a.ID).Column("AccountID").GeneratedBy.Assigned(); 
     Map(a => a.Title); 
     HasMany<Account>(a => a.ChildAccounts) 
      .Table("Accounts") 
      .KeyColumn("ParentAccountID") 
      .ForeignKeyConstraintName("AccountID") 
      .OrderBy("Title") 
      .Inverse(); 
     References<Account>(a => a.ParentAccount).Column("ParentAccountID"); 
    } 
} 

Les données du tableau des comptes dans la base de données SQLite quand je suis en train de récupérer l'identifiant du compte:

ID  Title  ParentAccountID 
--  -----  --------------- 
1   Account1  null 
2   Account2  1 
3   Account3  2 
4   Account4  2 

Quand je fais l'appel session.Get<Account>(2) je reviens l'objet suivant:

{ 
    ID: 2, 
    Title: "Account2", 
    ParentAccount: 
    { 
     ID: 1, 
     Title: "Account1", 
     ParentAccount: null, 
     ChildAccounts: null 
    }, 
    ChildAccounts: null 
} 

Exécution du même appel sur le retour de la base de données SQL Server réel:

{ 
    ID: 2, 
    Title: "Account2", 
    ParentAccount: 
    { 
     ID: 1, 
     Title: "Account1", 
     ParentAccount: null, 
     ChildAccounts: 
     { 
      ID: 2, 
      Title: "Account2", 
      ParentAccount: 
      { 
      ... 
      }, 
      ChildAccounts: 
      { 
      ... 
      } 
     } 
    }, 
    ChildAccounts: 
    [ 
     { 
      ID: 3, 
      Title: "Account3", 
      ParentAccount: 
      { 
       ID: 2, 
       Title: "Account2", 
       ParentAccount: 
       { 
       ... 
       }, 
       ChildAccounts: 
       { 
       ... 
       } 
      }, 
      ChildAccounts: null 
     }, 
     { 
      ID: 4, 
      Title: "Account4", 
      ParentAccount: 
      { 
       ID: 2, 
       Title: "Account2", 
       ParentAccount: 
       { 
       ... 
       }, 
       ChildAccounts: 
       { 
       ... 
       } 
      }, 
      ChildAccounts: null 
     } 
    ] 
} 

Je ne comprends vraiment pas pourquoi cela b e travaille dans SQL Server mais pas dans SQLite, mais il fait un test d'écriture pour s'assurer que mes mappings et le code du référentiel fonctionnent correctement, très difficile.

Répondre

0

Avez-vous essayé de profiler le sqlite db à l'aide du profileur sql? Je suppose que le profileur fonctionne avec sqlite mais je ne l'ai jamais essayé.

Une autre chose à regarder serait le fichier journal nhibernate. Habituellement, lorsque j'ai des problèmes comme celui-ci, ces deux outils sont là où je commence.