NHibernate:在Mapping中使用基类时避免N + 1个问题

时间:2017-06-28 09:46:03

标签: c# nhibernate nhibernate-mapping

我有以下情况:

Session类有许多ProcessableItem个,SqlTask来自ProcessableItem类。 SqlTask可以有很多变量(属性SqlTaskInputParametersSqlParameterVariable类;有些任务没有变量。)

关键点在Session类中ProcessableItem(不是任务本身)用作导航属性:

public class Session 
{
    [DataMember]
    public virtual IList<ProcessableItem> ProcessableItems
    {
        get { return this._items; }
        set { this._items = value; }
    }       
}

public SessionMap()
{
    HasMany(t => t.ProcessableItems)
}

public class ProcessableItem
{
    ...
}

public class SqlTask : ProcessableItem
{
    [DataMember]
    public virtual IList<SqlParameterVariable> SqlTaskInputParameters { get; set; };
}

所以在这种情况下,基类ProcessableItem被用作导航属性,我想急切加载SqlTask的变量对象,以避免n + 1问题。

这是我的代码,但是如何访问派生的SqlTask的特定属性(如SqlTaskInputParameters):

var query = session.Query<ETLSession>()
                   .Where(s => s.Id == request.IdETLSession);
query.FetchMany(s => s.ProcessableItems)
                .ThenFetch(p => p.ChildsOnSuccess).ToFuture();
Session session = query.ToFuture().ToList().First();

1 个答案:

答案 0 :(得分:1)

您不能急于加载派生类的关系。

在你的情况下,你甚至不应该,因为你似乎已经在获取另一个集合(ChildsOnSuccess),而在这里获取另一个集合会在它们之间产生笛卡尔积,导致你的结果被复制。 (这是NHibernate的限制。)

好消息是,除了渴望获取解决N + 1问题外,还有其他方法。