2010-08-27 5 views
1

D'accord, j'ai une classe, CompanyJe ne peux pas comprendre ce que je fais mal avec cette base NHibernate requête

public class Company 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<Role> Roles { get; set; } 
} 

Et une autre classe, Role

public class Role 
{ 
    public virtual int Id { get; set; } 
    public virtual Company Company { get; set; } 
    public virtual RoleLevel RoleLevel { get; set; } 
} 

J'utilise la Automappings fluides, rien de spécial en cours.

J'ai cette méthode:

private RoleLevel GetRole(int companyId) 
{ 
    var allRoles = Session.CreateCriteria<Role>().List<Role>(); 

    var role = Session.CreateCriteria<Role>() 
     .CreateAlias(NameOf<Role>.Property(r => r.Company), "c") 
     .Add(Restrictions.Eq("c.Id", companyId)) 
     .UniqueResult<Role>(); 

    return (role == null) ? RoleLevel.Restricted : role.RoleLevel; 
} 

companyId est transmis en tant que 102. Si je vérifie le tableau allRoles, l'un d'entre eux concerne la société # 102. Mais la requête qui est censée renvoyer un seul Role renvoie null.

Qu'est-ce que je fais mal?

EDIT 1

Sur demande, voici la requête en cours d'exécution, selon NHProf:

SELECT this_.Id   as Id75_1_, 
     this_.Version as Version75_1_, 
     this_.RoleLevel as RoleLevel75_1_, 
     this_.DbDate  as DbDate75_1_, 
     this_.Account_id as Account5_75_1_, 
     this_.Company_id as Company6_75_1_, 
     c1_.Id   as Id71_0_, 
     c1_.Version  as Version71_0_, 
     c1_.Name   as Name71_0_, 
     c1_.OnyxAlias as OnyxAlias71_0_, 
     c1_.DbDate  as DbDate71_0_, 
     c1_.Parent_Id as Parent6_71_0_ 
FROM "Role" this_ 
     inner join "Company" c1_ 
     on this_.Company_id = c1_.Id 
WHERE c1_.Id = 102 /* @p0 */ 

EDIT 2

J'ai essayé de changer la base de données SQL Server. Dans SQL Server, tout fonctionne. Je suppose que c'est un bug avec la façon dont NHibernate se connecte aux bases de données SQLite? Pour l'instant, je peux utiliser une base de données SQL Server à des fins de test, mais j'aimerais utiliser une base de données In Memory SQLite à l'avenir, pour des raisons de rapidité.

+1

utilisez-vous SQL Server? Si oui, essayez d'exécuter une trace sur le serveur et voir la requête. cela pourrait vous aider à détecter si vous faites quelque chose de mal. – devnull

+0

Ceci est dans un test, donc il utilise SQLite. Je vais ajouter la requête en cours d'exécution à ma question. –

+1

NHProf devrait avoir une option en bas - "voir n lignes résultant de cette requête." Y a-t-il des résultats? (Vous devrez configurer la connexion dans NHProf pour utiliser cette fonctionnalité.) – Jay

Répondre

1

Tout d'abord avez-vous exécuté la requête par rapport à la base de données? Deuxièmement, si quelque chose ne va pas avec le mappage, pourriez-vous essayer un autre CreateCriteria à la place? Vous pouvez ensuite speficfy le jointype comme ci-dessous. Juste pour nous assurer que nous avons essayé toutes les bases avant de passer plus :)

private RoleLevel GetRole(int companyId) 
{ 
    var allRoles = Session.CreateCriteria<Role>().List<Role>(); 

    var role = Session.CreateCriteria<Role>("r") 
     .CreateCriteria("Company", "c", JoinType.LeftOuterJoin) 
     .Add(Restrictions.Eq("c.Id", companyId)) 
     .UniqueResult<Role>(); 

    return (role == null) ? RoleLevel.Restricted : role.RoleLevel; 
} 

problème Troisièmement, le potentiel pourrait être que vous avez des guillemets doubles autour de vos noms de table. Cela indique un problème de mappage. Casing d'incompatibilité de nom de table ou quelque chose de similaire.

Questions connexes