2012-10-30 153 views
0

我有以下问题使用流利nhibernate和HasMany。我搜索谷歌和SO类似的问题,但我找到的任何解决方案都不能解决我的问题。流利NHibernate和HasMany映射

我有以下映射的entites(I为清楚起见省略大多数属性):

PaymentSchedule.cs

public class PaymentSchedule 
{ 
    public virtual BinaryId Id { get; set; } 

    public virtual IList<PaymentToSchedule> Payments { get; set; } 
} 

PaymentToSchedule.cs

public class PaymentToSchedule 
    { 
    public virtual BinaryId Id { get; set; }   

    public virtual PaymentSchedule PaymentSchedule { get; set; } 
} 

映射文件

PaymentScheduleMap。 cs

public class PaymentScheduleMap : ClassMap<PaymentSchedule> 
{ 
    public PaymentScheduleMap() 
    { 
     Table("A_Payment_Schedule"); 
     Id(x => x.Id, "A_Payment_Schedule_Id").CrmId(); 
     HasMany<PaymentToSchedule>(x => x.Payments).Table("A_Payment_To_Schedule").KeyColumns.Add("A_Payment_Schedule_Id").Fetch.Select(); 
    } 
} 

PaymentToScheduleMap.cs

public class PaymentToScheduleMap : ClassMap<PaymentToSchedule> 
{ 
    public PaymentToScheduleMap() 
    { 
     Table("A_Payment_To_Schedule"); 
     Id(x => x.Id, "A_Payment_To_Schedule_Id").CrmId();    
     References(x => x.PaymentSchedule, "A_Payment_Schedule_Id");    
    } 
} 

基本上我想加载PaymentSchedule对象时获取PaymentToSchedule entites的列表。在查询

var paymentSchedules = dataAccess.Session.QueryOver<PaymentSchedule>().List(); 

和每个付款时间表

var paymentToSchedule = (from pts in dataAccess.Session.Query<PaymentToSchedule>() 
               where pts.PaymentSchedule.Id == ps.Id). 
                 ToList<PaymentToSchedule>(); 

这工作得很好,但有什么办法来获取PaymentToSchedule的entites的列表:现在,要做到这一点,我必须使用此类查询付款时间表?

回答

0
var paymentSchedules = dataAccess.Session.QueryOver<PaymentSchedule>() 
    .Fetch(x => x.Payments).Eager; 
    .List(); 

// payments are already initialised, you can safly do 
var allPayments = paymentSchedules.SelectMany(ps => ps.Payments).ToList(); 
+0

不幸的是,这段代码不起作用。它导致一个空的集合,而执行sql select语句导致返回1行。此外,我使用ShowSql()选项,而会话工厂配置和nhibernate执行适当的SQL来获取PaymentToSchedule实体...但似乎并没有填充集合。 – krajew4

+0

然后出现了问题。可以尝试不使用'.Fetch.Select()'? – Firo