2011-11-07 5 views
3

Nous effectuons actuellement une mise à niveau de NHibernate 2 vers la version 3.1. Le scénario suivant a fonctionné avec l'ancien fournisseur LINQ mais ne fonctionne pas avec le nouveau fournisseur dans NHibernate 3.1.Mise à niveau vers NHibernate 3.1: bogue avec les collections de composants LINQ, Any et mappées

Voici le mappage pour le scénario:

public class FooDbMap : ClassMap<Foo> 
{ 
    public FooDbMap() 
    { 
     Id(x => x.Id); 

     HasMany(x => x.Bars) 
      .Component(part => 
       { 
        part.Map(y => y.Name); 
       }) 
      .KeyColumn("FooId") 
      .Table("FooBars"); 
    } 
} 

NHibernate génère correctement le schéma du mapping ci-dessus:

create table Foo (
    Id UNIQUEIDENTIFIER not null 
) 

create table FooBars (
    FooId UNIQUEIDENTIFIER not null, 
    Name TEXT not null, 
    primary key (FooId, Name) 
) 

Cependant, la requête suivante génère une erreur:

Session.Query<Foo>() 
    .Where(foo => foo.Bars.Any()) 
    .ToList(); 

L'erreur est: Système .Data.SqlClient.SqlException: nom de colonne 'Id' incorrect.

Le SQL NHibernate a généré est:

select foo0_.Id as Id20_ 
from Foo foo0_ 
where exists (select bar1_.Id from Bar bar1_ 
       where foo0_.Id = bar1_.FooId) 

presque droite, mais pas tout à fait - à la dernière minute NHibernate se trompe et décide qu'il devrait y avoir une colonne Id sur la table de bar.

Ce problème ne se présentait pas avec l'ancien fournisseur Linq-to-Nhibernate.

Je peux penser à quelques solutions de contournement, mais est-ce un bug ou une fonctionnalité de NHibernate?

Répondre

1

Bug est toujours présent dans NHibernate 3.3.3.

Pour contourner ce problème, vous pouvez utiliser .Count() > 0:

Session.Query<Foo>() 
    .Where(foo => foo.Bars.Count() > 0) 
    .ToList(); 
Questions connexes