我们目前正在从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错误或功能吗?
最佳答案
这是一个错误。您可以在这里投票:NH-2692
关于nhibernate - 升级到NHibernate 3.1:LINQ,Any和映射组件集合的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8032453/