Обновление до NHibernate 3.1: ошибка с LINQ, Any и сопоставленными коллекциями компонентов - PullRequest
3 голосов
/ 07 ноября 2011

В настоящее время мы проводим обновление с 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?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Это ошибка. Вы можете проголосовать здесь: NH-2692

1 голос
/ 13 апреля 2013

Ошибка по-прежнему присутствует в NHibernate 3.3.3.

В качестве обходного пути вы можете использовать .Count() > 0:

Session.Query<Foo>()
    .Where(foo => foo.Bars.Count() > 0)
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...