如何防止Nhibernate获取派生类?

如何防止Nhibernate获取派生类?,nhibernate,nhibernate-mapping,fetch,linq-to-nhibernate,class-table-inheritance,Nhibernate,Nhibernate Mapping,Fetch,Linq To Nhibernate,Class Table Inheritance,我使用的是Nhibernate,在获取具有多个派生类(每个类映射不同的表)的基类时遇到问题。当我看到这个请求时,Nhibernate连接到每个派生表上,这对性能有很大的影响 以下是我的课程的简化视图: public class Animal{ public virtual int ID { get; set;} public virtual string Name { get; set;} } public class Dog : Animal{ //others pr

我使用的是Nhibernate,在获取具有多个派生类(每个类映射不同的表)的基类时遇到问题。当我看到这个请求时,Nhibernate连接到每个派生表上,这对性能有很大的影响

以下是我的课程的简化视图:

public class Animal{
    public virtual int ID { get; set;}
    public virtual string Name { get; set;}
}

public class Dog : Animal{
    //others properties
}

public class Cat: Animal{
    //others properties
}

public class Person{
    public virtual int ID { get; set;}
    public virtual IEnumerable<Animal> Animals { get; set;}
}
公共类动物{
公共虚拟整数ID{get;set;}
公共虚拟字符串名称{get;set;}
}
公营狗:动物{
//其他财产
}
公猫:动物{
//其他财产
}
公共阶层人士{
公共虚拟整数ID{get;set;}
公共虚拟IEnumerable动物{get;set;}
}
一个人有一张动物的名单,我只想知道它们的名字。这个例子并不完美,而且更复杂(一个银行程序),但它很好地反映了我的问题。 我知道可以用不同的方式来做,但这是一个遗产,所以我没有选择


提前感谢。

IMO NHibernate将只连接包含投影列的表。定义一个查询,但不返回
Person
,而是将您需要的属性投影到dto/匿名类中。

毕竟,我创建了一个类AnimalBase,它由Dog、Cat等继承,一个类Animal没有任何子类(两者都有接口IAnimal)

在我95%的请求中,我只需要Animal,我在其他对象中引用这个类,比如Person

不完美,但我没有找到更好的


感谢Firo的帮助。

请将您的查询张贴在您选择名称的地方,并提及您的继承映射策略(我假设每个子类都有一个表,但是否有鉴别器?)。另外,您使用的是哪个版本的NHibernate?@cremor table per subclass不需要鉴别器列。@cremor我使用table per subclass,但没有鉴别器列,我使用的是版本3。3@Firo它不需要一个,但这是可能的。请参见此处:此Animal类将在许多其他映射类中引用(它位于应用程序主表的右侧),因此我认为您的解决方案在我的情况下不可行。@Eric如果您需要完整的Animal类,那么NHibernate为什么不获取它?它不能将狗作为普通动物取回,因为这是错误的(假设您有检查类型或类似类型的代码)。获取完整对象或仅获取名称字符串,两者之间没有任何内容。您试图实现什么?如果您告诉NH加载动物,它必须加入其他表,以知道它必须创建哪个子类型。如果您知道,当从其他实体引用时,您只需要名称,然后映射不在此层次结构中的另一个动物,并引用所有其他实体的名称animal不是抽象类型,它包含许多信息,这些信息在我的大多数查询中都是足够的,因此,Nhibernate没有理由在我的case@Eric见我最后的评论。运行时类型很重要,因为可能有多态、类型检查、强制转换等都会失败。所以NH做了唯一正确的事情并连接了其他表