我有4个数据库表(Channel,User,Message,User2Channel)和相应的实体类:
class **Channel** {
int ChannelId {get;set;}
int ISet<User> UsersToChannel {get;set;}
...
}
class **Message** {
int MessageId {get;set;}
Channel Channel {get;set;}
User User {get;set;}
...
}
class **User**{
int UserId {get;set;}
ISet<Channel> Channels {get;set;}
...
}
我使用fluentnhibernate进行映射:
class **ChannelMap** {
ChannelMap(){
...
HasManyToMany(x => x.UsersInChannel)
.AsSet()
.Cascade.All().Inverse()
.Table("User2Channel")
.Not.LazyLoad();
}
}
class **UserMap** {
UserMap(){
HasManyToMany(x => x.Channels)
.AsSet()
.Cascade.All()
.Table("User2Channel")
.Not.LazyLoad();
}
}
我在此代码中加载消息:
...
var query = session.CreateQuery(@"select m from Message m");
var msgs = query.List<Message>();
...
在分析器中,我看到很多这样的查询:
SELECT ... FROM User2Channel WHERE ChannelId=654
SELECT ... FROM User2Channel WHERE ChannelId=655
etc
请!帮我!我怎么能解决这个问题?如果我有数千个频道 - 我也会在数据库中收到很多查询!
答案 0 :(得分:2)
您可以使用批次加载它们。这是一个不那么具有侵入性的选项(意思是:您不需要在域代码中执行任何操作)。
我不懂流利。所以这是你需要的xml映射:
<set name="Channels" ... batch-size="50">
...
</set>
这让NH可以一次预取50个频道。它将像这样查询它们:
SELECT ... FROM User2Channel WHERE ChannelId IN (654, 655, 656, ... 704)
这会使N+1
成为N/50+1
。