我们目前正在从NHibernate 2升级到3.1。以下情况在旧的LINQ提供程序中起作用,但在NHibernate 3.1中的新提供程序中不起作用。
以下是该场景的映射:
然而,下面的查询会生成错误:
错误信息为: System.Data.SqlClient.SqlException : 无效的列名 'Id'。 NHibernate 生成的 SQL 语句如下:
几乎正确,但不完全正确 - 在最后一刻,NHibernate出现错误,并决定Bar表上应该有一个Id列。
这个问题在旧的Linq-to-Nhibernate提供程序中并没有发生过。
我可以想到一些解决方法,但这是NHibernate的一个bug还是feature呢?
以下是该场景的映射:
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呢?