Свободный NHibernate, генерирующий дополнительное соединение и создающий дублирующиеся объекты в двунаправленных отношениях - PullRequest
2 голосов
/ 17 января 2011

Место может иметь одну или несколько областей, и, наоборот, каждая область имеет ровно одно место. Я использую версию 1.0.0.636 Fluent NHibernate.

Когда я добавил Fetch.Join () в VenueMap для устранения отложенной загрузки, сгенерированный SQL включает в себя соединение с таблицей Area из себя: (очевидно, упрощенно)

SELECT *  
FROM Areas  
LEFT OUTER JOIN Venues on Areas.VenueId = Venues.Id  
LEFT OUTER JOIN Areas as Areas2 on Venues.Id = Areas2.VenueId  

Это приводит к тому, что он возвращает дубликаты строк, поэтому каждое место имеет дублирующиеся области в своей коллекции. Я попытался использовать DistinctBy MoreLinq после получения всех Областей, но при этом у каждого Места остается дублирующиеся Области - он просто удаляет дублирующиеся области из основной коллекции. Это также кажется действительно грязным, потому что я возвращаю примерно в три раза больше данных, а затем выбрасываю их.

Как я упоминал выше, мой запрос состоит в том, чтобы получить все Области и загрузить все Места встречи.

Доменные объекты:

class Venue
{
int Id;
IList Areas;
}  
class Area
{
int Id;
Venue Venue;
}

Отображения:

public class VenueMap : ClassMap<Venue>  
    {  
        public VenueMap()  
        {  
        Table("Venues");   
                HasMany(v => v.Areas)  
                .KeyColumn("VenueId")  
                .Inverse()  
                .Fetch.Join();  
        }  

public class AreaMap : ClassMap<Area>  
    {  
        public AreaMap()  
        {  
            Table("Areas");  
            Id(a => a.Id);  
            References(a => a.Venue).Column("VenueId").Not.Nullable();  
        }  
    }  

Есть идеи, как я могу отсортировать свои сопоставления и удалить дублирующиеся Области? Я уже оооочень много гуглял уже ...

Спасибо, Monty

1 Ответ

1 голос
/ 17 января 2011

Так что указание .Not.LazyLoad() вместо Fetch.Join() в VenueMap на областях HasMany не работает?

UPDATE Что может сработать лучше, так это избавиться от Fetch.Join() в вашем отображении и использовать запрос Criteria следующим образом.

session.CreateCriteria<Area>()
.CreateAlias("Venue", "venue", JoinType.LeftOuterJoin)
.List<Area>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...