升级到NHibernate 3.1: LINQ、Any和映射组件集合存在的问题

3
我们目前正在从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的一个bug还是feature呢?
2个回答

2

这是一个Bug(错误)。您可以在此处进行投票:NH-2692


1
NHibernate 3.3.3仍存在Bug。
作为解决方法,您可以使用.Count() > 0
Session.Query<Foo>()
    .Where(foo => foo.Bars.Count() > 0)
    .ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接