场地可以有一个或多个区域,相反,每个区域只有一个场地。我正在使用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();
}
}
我有什么想法可以对我的映射进行排序并删除重复的区域?我已经做了很多谷歌搜索...
谢谢, 蒙蒂
答案 0 :(得分:1)
那么在.Not.LazyLoad()
区域的VenueMap中指定Fetch.Join()
而不是HasMany
是不行的?
<强>更新强>
可能更好的方法是删除映射中的Fetch.Join()
并使用这样的Criteria查询。
session.CreateCriteria<Area>()
.CreateAlias("Venue", "venue", JoinType.LeftOuterJoin)
.List<Area>()