升级到NHibernate 3.1:LINQ,Any和映射组件集合的错误

时间:2011-11-07 03:31:25

标签: nhibernate

我们目前正在从NHibernate 2升级到3.1。以下方案适用于旧的LINQ提供程序,但不适用于NHibernate 3.1中的新提供程序。

以下是该方案的映射:

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正确地从上面的映射生成模式:

create table Foo (
    Id UNIQUEIDENTIFIER not null
)

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

但是,以下查询会生成错误:

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

错误是: System.Data.SqlClient.SqlException:列名'Id'无效。

NHibernate生成的SQL是:

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

几乎是正确的,但并不完全 - 在最后一刻NHibernate错了,并决定Bar表上应该有一个Id列。

旧的Linq-to-Nhibernate提供程序不会发生此问题。

我可以想到一些解决方法,但这是一个NHibernate错误或功能吗?

2 个答案:

答案 0 :(得分:2)

这是一个错误。您可以在此投票:NH-2692

答案 1 :(得分:1)

NHibernate 3.3.3中仍然存在Bug。

作为解决方法,您可以使用.Count() > 0

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