В настоящее время мы проводим обновление с 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'.
SQL, который сгенерировал NHibernate:
select foo0_.Id as Id20_
from Foo foo0_
where exists (select bar1_.Id from Bar bar1_
where foo0_.Id = bar1_.FooId)
Почти верно, но не совсем - в последнюю минуту NHibernate делает это неправильно и решает, что долженбыть столбцом Id в таблице Bar.
Эта проблема не возникала раньше со старым поставщиком Linq-to-Nhibernate.
Я могу придумать несколько обходных путей, но этоошибка или функция NHibernate?