2011-11-22 58 views
6

给予团队 - >运动员关系并询问所有运动员。什么 我误解了fetch="Join"?这个映射是否应该通过连接加载团队 ?当迭代运动员时, 仍然会延迟加载团队。NHibernate加入提取(Kind)

public class AthleteMap : ClassMapping<Athlete> 
{ 
     public AthleteMap() 
     { 
      ManyToOne(a => a.Team, o => 
             { 
              o.Fetch(FetchKind.Join); 
              o.Lazy(LazyRelation.NoLazy); 
             } 
       );  
     }  
} 

将会产生这种HBM:

<class name="Athlete" table="Athletes"> 
    <id name="Id" type="Int32" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <many-to-one name="Team" fetch="join" lazy="false" /> 
    <property name="Created" /> 
</class> 

迭代:

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>()) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 
+0

你有例外吗?至极? – Gerard

+0

所以当你迭代时,你会看到每个'运动员'获取一个'Team'的查询?我的意思是,除了渴望获取之外,映射是正确的吗? –

+0

没有例外。 @GertArnold在迭代时是,它在每次迭代时都向团队查询。 – mxmissile

回答

13

NHibernate的LINQ查询不使用映射的获取策略。你必须像这样在你的linq查询中获取()。

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>().Fetch(x => x.Team)) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 

在映射文档中所定义的取策略影响:

  • 经由获取检索()或负载()
  • 检索时的关联之间进行导航这种情况发生隐式
  • 的ICriteria查询
  • HQL查询是否使用子选取提取

来源:performance-fetching

+1

谢谢...羞愧他们的Linq实现是不完整的,像这样。 – klkitchens