将Nhibernate父实体强制转换为子级

时间:2014-01-17 10:55:39

标签: c# nhibernate inheritance casting

public class ParentMap : Map<Parent>
    {
        public ParentMap()
        {
            DiscriminateSubClassesOnColumn<string>("Provider").Nullable();
        }
    }

儿童:

public class Child1Map : SubclassMap<Child1>
{
    public FacebookAccountMap()
    {
        DiscriminatorValue("child1");
    }
}
public class Child2Map : SubclassMap<Child2>
{
    public FacebookAccountMap()
    {
        DiscriminatorValue("child2");
    }
}

来自服务我获取Parent的实例但属性item.Provider等于 childOne ,我如何获得Child1Child2的实例基于关于proprty提供者的价值

1 个答案:

答案 0 :(得分:0)

你的问题我害怕不是很清楚,但我会猜测:

很可能你没有收到Parent的实例,而是ParentProxy的实例,这是NHibernate生成的继承自Parent的类。此类不能转换为Child1,但实例实际上包含 Child1类的实例。方法调用被转发到此包含的类。这个机制是NHibernate的延迟加载系统的一部分 - 因为NHibernate需要创建代理对象而不加载完整的对象数据,它不知道要使用哪种确切的类型。

如果您通过关注其他类的引用来获取实例,则会发生这种情况。

这个想法通常是:

  1. 你通常不需要施放。如果你需要从基类转换为子类,你没有成功创建一个好的面向对象的设计,你应该探索避免转换的方法(因为继承结构意味着调用者不需要关心实际的子类,施法的必要性违反了这一原则,因此应尽可能避免。)
  2. 如果您真的必须访问真正的Child1实例,则可以provide an As<T>() method in the base class