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?