流利的Nhibernate:渴望加载私人收藏

时间:2013-07-15 22:26:39

标签: c# nhibernate fluent-nhibernate mapping domain-driven-design

我查看了堆栈溢出,无法在任何地方找到答案。

说我有一个班级人员

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()来急切加载它,但是当它被设置为受保护时,我找不到一种方法来急切加载该集合。

我还应该提一下,我希望逐个加载代码,而不是映射。

感谢。

1 个答案:

答案 0 :(得分:3)

我只是简单地对此进行了测试,并且无法确认它是否100%正常工作,但您应该能够使用反射获取属性并创建一个表达式,该表达式会急切加载该属性。

首先,通过反思得到财产:

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

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

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();