0

我使用Nhibernate,并且在使用多个派生类(每个类映射不同的表)获取基类时遇到问题。当我观看请求,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;} 
} 

一个人有名单动物和我只是想要他们的名字。这个例子并不完美,而且更复杂(一个银行业务程序),但这反映了我的问题。 我知道它可以做不同的等等,但它是一个遗产,所以我没有选择...

在此先感谢。

+2

请将您的查询发布到您选择名称并提及您的继承映射策略(我假设每个子类有表,但有无歧义?)。另外,你使用的是哪个版本的NHibernate? – cremor

+0

每个子类@cremor表不需要鉴别器列。 – Firo

+0

@cremor我正在使用每个子类的表,但没有鉴别器列,我正在使用版本3.3 – Eric

回答

0

毕竟特性,我创建了被狗,猫继承等一类AnimalBase和一类动物没有任何孩子(都有接口IAnimal)。

由于95%的要求,我只需要动物,我在我的其他对象像Person中引用这个类。

并不完美,但我没有找到更好的东西......

FIRO感谢您的帮助。

1

IMO NHibernate只会连接包含投影列的表格。定义查询,但不会返回Person但项目到DTO /匿名类,你需要

+0

这个动物类将被引用在许多其他映射类(它是在主表的应用程序),所以我认为你的解决方案不适用于我的情况。 – Eric

+0

@Eric如果你需要完整的动物类,那么为什么不应该NHibernate获取它?它不能将狗作为普通动物抓取,因为那会是错误的(假设你有检查类型的代码或类似的东西)。要么获取完整的对象,要么只获取名称字符串,它们之间没有任何内容。 – cremor

+0

你想达到什么目的?如果您告诉NH要加载动物,则必须加入其他表格才能知道要创建哪个子类型。如果你只需要从其他实体引用时需要的名字,然后映射不在这个层次结构中的另一种动物,并引用来自所有其他实体 – Firo

相关问题