(流畅)nhibernate - 根据查询中引用的基类的子类选择Object

时间:2012-02-16 07:46:27

标签: nhibernate reference fluent-nhibernate subclass fluent

我有4节课 Person(具有对Animal类型的引用(将包含继承Animal的类)) 动物(抽象基地) 狗(继承动物) 猫(继承动物)

为了清楚我正在使用Table-per-class映射,所以我有一个Animal,Dog和Cat数据库表。

我想做的是选择每个有狗的人,如果可能的话,可以过滤狗类中的字段。如果可能的话,我宁愿通过类型安全代码完成所有这些操作,如果可能的话,不要直接使用SQL或字符串来阻止代码中断。

这是否可能(流利的1.2)nhibernate(3.1)?有人可以开始指点我正确的方向吗?我的查询比解释的要复杂一点,但这是它的核心。

还有点偏离主题,但有没有在mappingSession.QueryOver()下有所有方法的描述?那里有很多东西,有些是显而易见的,但像Fetch等其他人并不清楚他们都做了什么,可能就是为什么我这么难找到。

---编辑类供参考---

 public class Person
{
    Animal pet;
    public string Name;
}

public abstract class Animal
{
    public int ID;
    public string Name;
}

public class Dog : Animal
{
    public string Color;
}

public class Cat : Animal
{
    public string someOtherVal;
}

只使用一个会话对象我希望得到所有不同的人姓他们有宠物类型Dog和狗是棕色的名字。

这是我想要最终得到的最终查询,但我试着开始只是让那些有狗的人,因为我认为这很容易,但似乎事实并非如此。

我原来的Querys试过了

Dog dog = null;
            var test2 = session.QueryOver<Person>()
                .Inner.JoinAlias(x=>x.Pet, ()=> dog)
                .Where(()=>dog != null)
                .List();

我也有预测可以减少它的名字,但我仍然无法限制只有狗的人。

1 个答案:

答案 0 :(得分:0)

以下是如何实现此目标的示例:

http://jameskovacs.com/2011/02/16/getload-polymorphism-in-nhibernate-3/

var animal = session.CreateCriteria<Animal>()
                    .Add(Restrictions.IdEq(dogId))
                    .UniqueResult<Animal>();

你也可以试试这样的东西,我不是百分之百确定它会起作用,但是你可以尝试一下:

var animal = session.CreateCriteria<Animal>()
                     .Add(Restrictions.On<Dog>(m=>m.Id == 1))
                     .UniqueResult<Animal>();

这有帮助吗?

相关问题