【问题标题】:How to map inheritance with property returned other inheritance?如何映射继承与属性返回的其他继承?
【发布时间】:2011-03-01 21:00:10
【问题描述】:

我有抽象类 Vehicle 和两个派生自 Car 和 ForkLift 的类。

public abstract class Vehicle
{
    public EngineBase Engine { get; set; } 
}

public class Car : Vehicle
{
    public GasEngine Engine { get; set; }
}

public class ForkLift : Vehicle
{
    public ElectricEngine Engine { get; set; }
}

和引擎类:

public abstract class EngineBase
{
}

public class GasEngine : EngineBase
{
}

public class ElectricEngine : EngineBase
{
}

引擎映射到“每个类层次结构的表”。对于 Vehicles,我想使用相同的模式。

如何映射 Engine 类并使用该 Engine 属性派生?

如何通过延迟加载来做到这一点?

【问题讨论】:

    标签: nhibernate inheritance mapping table-per-hierarchy


    【解决方案1】:

    该代码无法编译,因此您不可能映射它。

    【讨论】:

    • 我知道没有“new”修饰符,但假设这是伪代码。
    • 如果你有 new 修饰符,这些属性将完全不相关,这使得不需要在 Vehicle 中添加 EngineBase。
    • 确实如此,但引擎具有共同的属性,我可以在所有车辆的列表中显示这些属性。如何更改课程以实现这一目标?
    【解决方案2】:

    在 Vehicle 中使用受保护的字段并将其映射到访问策略:

    public abstract class Vehicle
    {
        protected Engine _engine;
    }
    

    在 Fluent NHibernate 中,这将被映射:

    References(x => x.Engine, "EngineId").Access.CamelCaseField(Prefix.Underscore);
    

    那么扩展 Vehicle 的类可以根据需要进行强制转换:

    public class Car : Vehicle
    {
        public GasEngine
        {
            get { return (GasEngine)_engine; }
            set { _engine = Value; }
        }
    }
    

    【讨论】:

    • 好的,但是我不能使用延迟加载。您不能将 _engineProxy 转换为 GasEngine 等 :(
    • 你确定吗?您应该获得可以转换的具体类型的代理。
    • 我也有同样的问题。我取回的代理实体只是基类的代理,不能强制转换为派生类。这对我来说没有任何意义,但这是真的。这似乎完全违背了 NHibernate 应该为你做的事情。我必须使用非惰性映射才能使其工作。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多