Fluent Nhibernate:渴望加载私人收藏

本文关键字:加载 私人收藏 渴望 Nhibernate Fluent | 更新日期: 2023-09-27 18:22:23

我查看了堆栈溢出的情况,但在任何地方都找不到答案。

假设我有一个班的人

class Man
{
    protected virtual ICollection<Cat> Cats {get; set;}
}
class ManMapping : ClassMap<Man>
{
    HasMany(Reveal.Member<Man, IEnumerable<Cat>>("Cats"))
            .KeyColumn("ManId")
            .Cascade.All();
}

我知道,如果它是一个公共属性,我可以使用.fetch()来急切地加载它,但当集合设置为受保护时,我找不到急切地加载集合的方法。

我还应该提到,我希望在逐个案例的基础上,而不是在映射中,急切地加载代码。

谢谢。

Fluent Nhibernate:渴望加载私人收藏

我只是简单地测试了一下,还不能确认它100%有效,但你应该能够使用反射来获取属性,并创建一个表达式来加载属性。

首先,通过反射获得属性:

var catsProperty = typeof(Man).GetProperty("Cats", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

然后,创建一个指向Man的表达式参数,以及一个获取属性的表达式:

var expressionArgument = Expression.Parameter(typeof(Man), "m");
var propertyGetter =
    Expression.Lambda<Func<Man, IEnumerable<Cat>>>(
        Expression.Property(expressionArgument, catsProperty),
        expressionArgument);

然后在linq查询中使用它:

var man =
    session.Query<Man>()
        .Fetch(propertyGetter)
        .First();