如何使用NHibernate映射SampleCount属性

如何使用NHibernate映射SampleCount属性,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有两个表-Run和Sample,其中Sample.RunId是一个外键,它将样本链接到它们的运行 我希望在Run中有一个SampleCount属性,它是与特定Run关联的示例对象的数量 是否可以在运行类型的NHibernate映射中映射这样的属性 谢谢。虽然你可以用来做,但这不是一个好主意 相反,将您的Run.Samples集合声明为lazy=“extra”,访问Run.Samples.Count将对计数进行查询,而不是加载整个集合。尽管Diego Mijelshon的集合解决方案完全有效,但

我有两个表-Run和Sample,其中Sample.RunId是一个外键,它将样本链接到它们的运行

我希望在Run中有一个SampleCount属性,它是与特定Run关联的示例对象的数量

是否可以在运行类型的NHibernate映射中映射这样的属性


谢谢。

虽然你可以用
来做,但这不是一个好主意


相反,将您的
Run.Samples
集合声明为
lazy=“extra”
,访问
Run.Samples.Count
将对计数进行查询,而不是加载整个集合。

尽管Diego Mijelshon的集合解决方案完全有效,但它确实意味着在获取
Run
实体后需要额外的查询。如果尚未映射集合而不希望或不希望进行附加查询,请考虑“计算”属性为

中运行
类映射

<property name="SamplesCount" type="long" formula="(select count(s.Id) from Samples s where s.RunId = Id)" />
请注意,在查询中,对于“s.RunId=Id”部分,NHibernate将为根表插入正确的别名。另外,不要忘记括号,它使解析器更容易,在某些情况下是必需的


这种方法的好处是在select上应用子查询(这可能好,也可能不好,取决于您的情况)。如果您很少需要该属性,也可以延迟加载该属性(我认为是NH 2++功能)。

在更新时会产生问题,并且每次访问运行时都会加载额外的数据。在这种情况下使用它是一种黑客行为(并不是说我没有这么做过…)很好,我之前没有引用当前实体的公式。顺便说一句,延迟加载属性是NH3.x的新特性,所以现在只有在您愿意参考主干版本的情况下才能使用它们。听起来很棒。我一定会尝试一下。有趣的是,在2.1.2GA中,映射验证了属性惰性,尽管它实际上没有完成
long SamplesCount {get; set;}