QueryOver <iinterface>获取所有实现</iinterface>

时间:2012-07-13 14:17:28

标签: nhibernate interface fluent-nhibernate fluent-nhibernate-mapping

Nhibernate有一个很好的功能,我巧合地发现了这个功能:

public interface IInterface {}

public class Impl1 : IInterface {}

public class Impl2 : IInterface {}

ISession session = sf.OpenSession();
session.QueryOver<IInterface>().List();

这将获取所有Impl1 ans Impl2个对象(如果这些类被映射)。它们不需要映射为SubClassMaps,这使我得出NHibernate自己解析实现类的结论。

任何人都可以向我发送有关此文档的链接吗?我不知道这个功能的名称和技术背景......

提前致谢!

1 个答案:

答案 0 :(得分:0)

实际上,这只是NHibernate inheritance mapping的方式。

除了您描述的用法之外,您还可以使用基类型在对象上定义子集合,并将任何继承类型的对象放入集合中。例如,您可以拥有另一个包含IInterface个对象集合的实体:

public class MyEntity
{
    public IList<IInterface> MyCollection { get; set; }
}

现在你可以把任何实现IInterface的对象放到MyCollection中,NHibernate会持久化它们(如果映射是正确的):

Impl1 i1 = new Impl1();
Impl2 i2 = new Impl2();
MyEntity entity = new MyEntity();
entity.MyCollection.Add(i1);
entity.MyCollection.Add(i2);

session.Save(entity);

但是,实际的数据库使用情况(生成的SQL)取决于您定义的继承映射策略,因此请先熟悉它们。您可以在official documentation中阅读更多内容。