流畅的NHibernate生成额外的连接并以双向关系创建重复的实体

时间:2011-01-17 15:18:52

标签: fluent-nhibernate

场地可以有一个或多个区域,相反,每个区域只有一个场地。我正在使用Fluent NHibernate的构建1.0.0.636。

当我将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  

这导致它返回重复的行,因此每个Venue在其集合中都有重复的区域。在获得所有区域后,我尝试使用MoreLinq的DistinctBy,但这仍然使每个Venue都有重复区域 - 它只是从主要集合中删除了重复区域。它也感觉非常肮脏,因为我返回的数据大约是数据的三倍然后扔掉了。

正如我上面所提到的,我的问题是获取所有区域并让所有场地都加载。

域实体:

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();  
        }  
    }  

我有什么想法可以对我的映射进行排序并删除重复的区域?我已经做了很多谷歌搜索...

谢谢, 蒙蒂

1 个答案:

答案 0 :(得分:1)

那么在.Not.LazyLoad()区域的VenueMap中指定Fetch.Join()而不是HasMany是不行的?

<强>更新 可能更好的方法是删除映射中的Fetch.Join()并使用这样的Criteria查询。

session.CreateCriteria<Area>()
.CreateAlias("Venue", "venue", JoinType.LeftOuterJoin)
.List<Area>()