抽象类和NHibernate

时间:2011-07-02 11:07:51

标签: nhibernate orm

我有一个班级:

class abstract Car {
    ...
}

class ConcreteCar {
    ...
}

class AnotherConcreteCar {
    ...
}

然而,如何在NHibernate中映射这些似乎非常令人困惑。我确实需要能够收集:

List<Car> cars;
for (Car car in cars) {
    ...
}

我还想使用生成器(替代方案是什么?)来生成下一个carID。有一个join-subclass,它不允许这样做,坦率地说,这让我很困惑。我似乎不得不回到让Car成为一个界面,这不是我想要的。

此外,无论我使用什么方法(比如我只是让Car成为超类和其他子类),如果我查询数据库:

from item in session.Query<Car>()
select item;

我是否必须将对象类型转换为子类类型以使用子类属性和方法?那会有用吗? NHibernate是否实际上找出了子类并创建了子类的对象,还是只创建了无法转换为子类的超类的对象?

3 个答案:

答案 0 :(得分:1)

我已经在不久前实现了这种方法,但我记得它在我的特定情况下工作。

我假设Car是包含一些共享列的基表,如果是这样,那么你可以用以下方式映射你的实体(我正在使用Fluent NHibernate):

CarMap:

public class CarMap : ClassMap<Car> { ... }

<强> ConcreteCarMap:

public class ConcreteCarMap : SubclassMap<ConcreteCar>
{
    public ConcreteCarMap()
    {
        Extends<CarMap>();

        // other properties
        // Map(x => x.Property).Not.Nullable();
    }
}

拥有你可以执行你的查询:

from item in session.Query<Car>() select item;

实际上你必须将返回的对象强制转换为它们的子类类型才能访问子类属性和方法,但是NHibernate将intelligent足以为你正确地构造它们。

NHibernate将使用这种语法(伪sql)实现这一点:

select

-- all columns from Car
-- all columns from ConcreteCar 
-- other columns from subclasses

case 
    when f1.SubId is not null then 1
    when f2.SubId is not null then 2
    when f3.SubId is not null then 3
    when f4.SubId is not null then 4
    when f5.SubId is not null then 5
    when f0.Id is not null then 0
end as type

from Car f0
left outer join ConcreteCar f1 on f0.Id = f1.SubId
-- other joins

因此,根据实际的子类数量,这会对性能产生影响。

我希望这能回答你的问题。

答案 1 :(得分:0)

很有可能。
inheritance mapping
您可以使用session.Query<Car>和nHib知道创建相应子类的对象 如果您还有其他问题,请与我们联系。

答案 2 :(得分:0)

是的有效!

这是我的代码:

public abstract class Vote:EntityBase

public class VoteComment:Vote,IVote

public class VotePhoto:Vote,IVote


internal List<Vote> Test()
{
   return session.Query<Vote>().ToList();
}

这就是结果:

enter image description here